日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 与 .net socket_java.net.Socket/java.net.ServerSocket-TCP Socket编程

發布時間:2025/3/21 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 与 .net socket_java.net.Socket/java.net.ServerSocket-TCP Socket编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

TCP 的 Java 支持

協議相當于相互通信的程序間達成的一種約定,它規定了分組報文的結構、交換方式、包含的意義以及怎樣對報文所包含的信息進行解析,TCP/IP 協議族有 IP 協議、TCP 協議和 UDP 協議。現在 TCP/IP 協議族中的主要 socket 類型為流套接字(使用 TCP 協議)和數據報套接字(使用 UDP 協議)。

TCP 協議提供面向連接的服務,通過它建立的是可靠地連接。Java 為 TCP 協議提供了兩個類:Socke 類和 ServerSocket 類。一個 Socket 實例代表了 TCP 連接的一個客戶端,而一個 ServerSocket 實例代表了 TCP 連接的一個服務器端,一般在 TCP Socket 編程中,客戶端有多個,而服務器端只有一個,客戶端 TCP 向服務器端 TCP 發送連接請求,服務器端的 ServerSocket 實例則監聽來自客戶端的 TCP 連接請求,并為每個請求創建新的 Socket 實例,由于服務端在調用 accept()等待客戶端的連接請求時會阻塞,直到收到客戶端發送的連接請求才會繼續往下執行代碼,因此要為每個 Socket 連接開啟一個線程。服務器端要同時處理 ServerSocket 實例和 Socket 實例,而客戶端只需要使用 Socket 實例。另外,每個 Socket 實例會關聯一個 InputStream 和 OutputStream 對象,我們通過將字節寫入套接字的 OutputStream 來發送數據,并通過從 InputStream 來接收數據。

TCP 連接的建立步驟

客戶端向服務器端發送連接請求后,就被動地等待服務器的響應。典型的 TCP 客戶端要經過下面三步操作:

創建一個 Socket 實例:構造函數向指定的遠程主機和端口建立一個 TCP 連接;

通過套接字的 I/O 流與服務端通信;

使用 Socket 類的 close 方法關閉連接。

服務端的工作是建立一個通信終端,并被動地等待客戶端的連接。

典型的 TCP 服務端執行如下兩步操作:

創建一個 ServerSocket 實例并指定本地端口,用來監聽客戶端在該端口發送的 TCP 連接請求;

重復執行:

調用 ServerSocket 的 accept()方法以獲取客戶端連接,并通過其返回值創建一個 Socket 實例;

為返回的 Socket 實例開啟新的線程,并使用返回的 Socket 實例的 I/O 流與客戶端通信; 通信完成后,使用 Socket 類的 close()方法關閉該客戶端的套接字連接。

TCP Socket Demo

下面給出一個客戶端服務端 TCP 通信的 Demo,該客戶端在 20006 端口請求與服務端建立 TCP 連接,客戶端不斷接收鍵盤輸入,并將其發送到服務端,服務端在接收到的數據前面加上“echo”字符串,并將組合后的字符串發回給客戶端,如此循環,直到客戶端接收到鍵盤輸入“bye”為止。

客戶端代碼如下:

packagezyb.org.client;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.PrintStream;importjava.net.Socket;importjava.net.SocketTimeoutException;public classClient1 {public static void main(String[] args) throwsIOException {//客戶端請求與本機在20006端口建立TCP連接

Socket client = new Socket("127.0.0.1", 20006);

client.setSoTimeout(10000);//獲取鍵盤輸入

BufferedReader input = new BufferedReader(newInputStreamReader(System.in));//獲取Socket的輸出流,用來發送數據到服務端

PrintStream out = newPrintStream(client.getOutputStream());//獲取Socket的輸入流,用來接收從服務端發送過來的數據

BufferedReader buf = new BufferedReader(newInputStreamReader(client.getInputStream()));boolean flag = true;while(flag){

System.out.print("輸入信息:");

String str=input.readLine();//發送數據到服務端

out.println(str);if("bye".equals(str)){

flag= false;

}else{try{//從服務器端接收數據有個時間限制(系統自設,也可以自己設置),超過了這個時間,便會拋出該異常

String echo =buf.readLine();

System.out.println(echo);

}catch(SocketTimeoutException e){

System.out.println("Time out, No response");

}

}

}

input.close();if(client != null){//如果構造函數建立起了連接,則關閉套接字,如果沒有建立起連接,自然不用關閉

client.close(); //只關閉socket,其關聯的輸入輸出流也會被關閉

}

}

}

服務端需要用到多線程,這里單獨寫了一個多線程類,代碼如下:

packagezyb.org.server;importjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.io.PrintStream;importjava.net.Socket;/*** 該類為多線程類,用于服務端*/

public class ServerThread implementsRunnable {private Socket client = null;publicServerThread(Socket client){this.client =client;

}

@Overridepublic voidrun() {try{//獲取Socket的輸出流,用來向客戶端發送數據

PrintStream out = newPrintStream(client.getOutputStream());//獲取Socket的輸入流,用來接收從客戶端發送過來的數據

BufferedReader buf = new BufferedReader(newInputStreamReader(client.getInputStream()));boolean flag =true;while(flag){//接收從客戶端發送過來的數據

String str =buf.readLine();if(str == null || "".equals(str)){

flag= false;

}else{if("bye".equals(str)){

flag= false;

}else{//將接收到的字符串前面加上echo,發送到對應的客戶端

out.println("echo:" +str);

}

}

}

out.close();

client.close();

}catch(Exception e){

e.printStackTrace();

}

}

}

服務端處理 TCP 連接請求的代碼如下:

packagezyb.org.server;importjava.net.ServerSocket;importjava.net.Socket;public classServer1 {public static void main(String[] args) throwsException{//服務端在20006端口監聽客戶端請求的TCP連接

ServerSocket server = new ServerSocket(20006);

Socket client= null;boolean f = true;while(f){//等待客戶端的連接,如果沒有獲取連接

client =server.accept();

System.out.println("與客戶端連接成功!");//為每個客戶端連接開啟一個線程

new Thread(newServerThread(client)).start();

}

server.close();

}

}

執行結果截圖如下:

總結

以上是生活随笔為你收集整理的java 与 .net socket_java.net.Socket/java.net.ServerSocket-TCP Socket编程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。