1. 程式人生 > >socket程式設計 與c通訊

socket程式設計 與c通訊

用ServerSocket和Socket來編寫伺服器程式和客戶程式,是Java網路程式設計的最基本的方式。這些伺服器程式或客戶程式在執行過程中常常會阻塞。例如當一個執行緒執行ServerSocket的accept()方法時,假如沒有客戶連線,該執行緒就會一直等到有了客戶連線才從accept()方法返回。再例如當執行緒執行Socket的read()方法時,如果輸入流中沒有資料,該執行緒就會一直等到讀入了足夠的資料才從read()方法返回。 兩種方法可以嘗試對比一下

第一種socket程式設計:
//首先建立socket連線
socket socket = new Socket(address,port); 
// 傳送請求到服務端面
@param eql  為要傳送的字元
public String sendMessageServer(Socket socket, String eql) {
//此方法將前4位做為位元組長度,後面跟所傳送的位元組
try {
String firstMessage = eql + "\n\0";
int meslength = firstMessage.length();
// 將長度轉換為無符號byte
byte[] b = toLH(meslength);
//得到字元的位元組數
int count = firstMessage.getBytes().length;
byte[] buf = new byte[count + 4];
// 將長度答存入同一個byte陣列字
System.arraycopy(b, 0, buf, 0, b.length);
System.arraycopy(firstMessage.getBytes(), 0, buf, 4, count);
out = socket.getOutputStream();
out.write(buf);
out.flush(); 
} catch (Exception e) {
e.printStackTrace();
}
return "";

// 接收服務端返回的資料
public String receiveMessageClient(Socket socket) {
String json = "";
try {
in = new InputStreamReader(socket.getInputStream());
int tempchar;
while ((tempchar = in.read()) != -1) {
if (((char) tempchar) != '\r') {
System.out.print((char) tempchar);
json += (char) tempchar +"";
}
}
} catch (Exception e) {
e.printStackTrace();
}
return json;
}

// 將int資料轉換為0~4294967295 (0xFFFFFFFF即DWORD)。
public long getUnsignedIntt(int data) {
return data & 0x0FFFFFFFFl;
}


/**
* 將int轉為低位元組在前,高位元組在後的byte陣列
*/
private static byte[] toLH(int n) {
byte[] b = new byte[4];
b[3] = (byte) (n & 0xff);
b[2] = (byte) (n >> 8 & 0xff);
b[1] = (byte) (n >> 16 & 0xff);
b[0] = (byte) (n >> 24 & 0xff);
return b;
}


/**
* 將int轉為低位元組在前,高位元組在後的int
*/
private static int toLH2(int in) {
int out = 0;
out = (in & 0xff) << 24;
out |= (in & 0xff00) << 8;
out |= (in & 0xff0000) >> 8;
out |= (in & 0xff000000) >> 24;
return out;
}

}

第二種 非阻試socket 客戶端、、、、、、、、、、、、、、、、、、、、、、

//首先建立連線

InetSocketAddress socketAddress = new InetSocketAddress(m_host,
10002); 

 //獲得與SelectionKey關聯的SocketChannel  

channel = SocketChannel.open(socketAddress); 

Charset charset = Charset.forName("UTF-8");// 建立GBK字符集

//將字元轉換成位元組
String firstMessage = eql + "\n\0";
String json = "";
try {
firstMessage = new String(firstMessage.getBytes(), "UTF-8");
int meslength = firstMessage.getBytes().length;

// 將長度轉換為無符號byte
byte[] b = toLH(meslength);
int count = firstMessage.getBytes().length;
byte[] buf = new byte[count + 4];
// 將長度答存入同一個byte陣列字
System.arraycopy(b, 0, buf, 0, b.length);
System.arraycopy(firstMessage.getBytes(), 0, buf, 4, count);


//傳送資料
channel.write(sendbuffer);

ByteBuffer sendbuffer = ByteBuffer.wrap(buf); 





/******* 讀取返回資料的前4個位元組 *****/
ByteBuffer length = ByteBuffer.allocate(4);
channel.read(length);
//總共位元組數
int ss = byteArrayToInt(length.array(), 0); 
 
/******* 讀取返回資料 *****/
int readlength = 1024;
ByteBuffer buffer = ByteBuffer.allocate(readlength);// 建立1024位元組的緩衝
// int byte_label = 0;
// if (ss <= readlength) {
// channel.read(buffer);
// json = new String(buffer.array(), "UTF-8");
// buffer.clear();
// } else {
// while (!(ss < readlength)) {
// channel.read(buffer);
// //System.arraycopy(buffer.array(), 0, str, byte_label,
// readlength);
// json += new String(buffer.array(), "UTF-8");
// ss = ss - readlength;
// byte_label =+ readlength;
// buffer.clear();
// }
// buffer = ByteBuffer.allocate(ss);
// channel.read(buffer);
// System.arraycopy(buffer.array(), 0, str, byte_label,
// buffer.array().length);
// json = new String(str, "UTF-8");
// channel.close();
// }

//System.out.printf("@%

[email protected]\n", ss);
ByteBuffer require = ByteBuffer.allocate(ss);
 

//將全部位元組讀完在退出
for (int n_read = 0; n_read < ss; ) {
int n;
n = channel.read(require);
if (n < 0) {
throw new Exception();
}
n_read += n;


//json = new String(require.array(), "UTF-8"); 

//將收到資料以字串展示
json = new String(require.array(),"UTF-8");
//System.out.printf(json);
//channel.close();
} catch (Exception e) {
throw new EqlException();


}


相關推薦

socket程式設計 c通訊

用ServerSocket和Socket來編寫伺服器程式和客戶程式,是Java網路程式設計的最基本的方式。這些伺服器程式或客戶程式在執行過程中常常會阻塞。例如當一個執行緒執行ServerSocket的accept()方法時,假如沒有客戶連線,該執行緒就會一直等到有了客戶連

Java:基於TCP協議網路socket程式設計(實現C/S通訊)

目錄 一、前言:TCP原理簡介 二、Socket程式設計通訊 三、TCP伺服器端(具體程式碼) 四、TCP客戶端(具體程式碼) 五、通訊效果演示 六、“創意”機器人:價值一個億的AI核心程式碼(具體程式碼) 七、最後   一、前言:TCP原理簡介 首先,保證文章完整性,TC

socket程式設計點到點通訊

//點到點通訊 //伺服器設計 #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <ar

Socket程式設計:本地通訊demo

伺服器建立: package server; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; impor

C++語言程式設計基礎》學習第十章泛型程式設計C++標準模板庫

 STL簡介:標準模板庫(Standard Template Library,簡稱STL)提供了一些非常常用的資料結構和演算法 標準模板庫(Standard Template Library,簡稱STL)定義了一套概念體系,為泛型程式設計提供了邏輯基礎 STL中的各個類模板、

程式設計C語言

第一次寫部落格,不說廢話了。 首先介紹一下C語言最基礎的一些知識吧。 計算機程式是什麼? 所謂程式就是一組計算機能識別和執行的指令。 計算機能直接識別和接受的二進位制程式碼稱為機器指令,機器指令集合為機器語言。 C語言符號集包括:英文字母、數字和一些有特定含義的

C++知識點(十)泛型程式設計C++STL標準模板庫

1.泛型程式設計 把程式碼從特定的資料結構中分離出來,使得它不依賴於特定的資料結構而更加通用 容器->迭代器->演算法 介面卡 2.概念:用於界定具備一定功能的資料型別 comparable:可比較 Assignable:可賦值 Sortable:可比較且可賦值 3.模型:符合一個

簡單的TCP協議 socket程式設計C語言版伺服器和客戶端)

         最近由於本人對網路程式設計的喜愛,所以對一點關於TCP協議socket程式設計的總結。由於本人的能力有限,寫的可能過於簡單,只適合初學者,歡迎大牛提出寶貴的意見,本人會感激不盡的。廢話少說了,進入正題。(下面程式碼是基於VC6.0)          下圖

(轉) linux socket 程式設計C語言)

     套接字是一種程序間的通訊的方法,不同於以往介紹的程序間通訊方法的是,它並不侷限於同一臺計算機的資源,例如檔案系統空間,共享記憶體或者訊息佇列。套接字可以認為是對管道概念的擴充套件——一臺機器上的程序可以使用套接字與另一臺機器上的程序通訊。因此客戶與伺服器可以分散在網路中。同一臺機器上的程序間也可以用

erlang 實現 c++ 通訊

網路通訊常用的有2種:文字通訊和二進位制通訊。文章分別在兩種方式上實現erlang與c++通訊。 一、erlang 與 c++ 行通訊 行通訊是一種文字通訊,格式如“cmd args\n”,比較簡單,erlang接收資料也比較簡單,可以設定引數 {packet, line}

[Visual Studio C++][Socket程式設計] Socket通訊原理詳細講解

(本文參考:https://www.cnblogs.com/wangcq/p/3520400.html  在原文的基礎上進行了擴充。)    對TCP/IP、UDP、Socket程式設計這些詞你不會很陌生吧?隨著網路技術的發展,這些詞充斥著我們的耳朵。那麼我想問

Linux下網路socket程式設計——實現伺服器(select)多個客戶端通訊

Linux下網路socket程式設計——實現伺服器(select)與多個客戶端通訊 置頂 2017年06月23日 14:44:37 閱讀數:3225 標籤: socket程式設計伺服器與多個客戶端通epoll多路複用C語言網路程式設計 更多

Visual C++網路程式設計經典案例詳解 第3章 多執行緒非同步套接字程式設計 程序間通訊 命名管道 命名管道例項

vc新增控制檯工程 名字命名管道例項 新增原始檔 名字 伺服器 #include<windows.h>                                //包含標頭檔案 #include<stdio.h> int main() {  

基於Netty5.0中級案例五之NettyC#Socket收發字串進行通訊

package com.itstack.netty; import java.nio.charset.Charset; import io.netty.channel.ChannelInitializer; import io.netty.channel.socket.SocketChannel

C# 】 簡易的Socket TCP Client客戶端 -- PLC通訊

public class SocketClient { //宣告IP,埠,和一個用來連線的Socket private string _ip; private int _port; private S

C語言socket程式設計---udp通訊及廣播

上篇實現了TCP通訊的例子。由於專案中需要一個伺服器向多臺客戶端傳送訊息。 通過udp這種無連線的通訊,將client.c增加一句 /* 設定通訊方式對廣播,即本程式傳送的一個訊息,網路上所有主機均可以收到 */ yes = 1; setsockopt(fd

C# Socket程式設計之繫結IP

 Socket serverSocket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);  //獲取Socket     &

javac語言之間的socket通訊c客戶端java伺服器端

寫在前面的宣告:程式例子均執行在ubuntu(是一個以桌面應用為主的Linux作業系統)上。當然你也可以把java執行在其它系統上,這裡只是為了方便。 上一篇文章已經說明了關於socket的一些知識,but這是遠遠不夠的,我相信只要你感興趣,學習它並不是什麼難事。 好吧,我

C#版 Socket程式設計(最簡單的Socket通訊功能)

 示例程式是同步套接字程式,功能很簡單,只是客戶端發給伺服器一條資訊,伺服器向客戶端返回一條資訊;這裡只是一個簡單的示例,是一個最基本的socket程式設計流程,在接下來的文章中,會依次記錄套接字的同步和非同步,以及它們的區別。 下面是示例程式的簡單步驟說明 伺服器端:

linux下socket程式設計 select實現非阻塞模式多臺客戶端伺服器通訊

select函式原型如下: int select (int maxfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); select系統呼叫是用來讓我們的程式