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编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java校园足球管理系统_基于jsp的校
- 下一篇: Java蓝牙电话_Android med