国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Java TCP Socket編程

2019-11-14 22:43:12
字體:
來源:轉載
供稿:網友
java TCP Socket編程1.TCP Socket在Java上的實現

Java 為 TCP 協議提供了兩個類:Socket 類和 ServerSocket 類。一個 Socket 實例代表了TCP 連接的一端。一個 TCP 連接(TCP connection)是一條抽象的雙向信道,兩端分別由 ip地址和端口號確定。在開始通信之前,要建立一個 TCP 連接,這需要先由客戶端 TCP 向服務器端 TCP 發送連接請求。ServerSocket 實例則監聽 TCP 連接請求,并為每個請求創建新的 Socket 實例。也就是說,服務器端要同時處理 ServerSocket 實例和 Socket 實例,而客戶端只需要使用 Socket 實例。每個Socket實例會關聯一個InputStream和OutputStream對象,我們通過將字節寫入套接字的OutputStream來發送數據,并通過從InputStream來接收數據。

2.TCP連接的建立步驟

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

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

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

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

服務端的工作是建立一個通信終端,并被動地等待客戶端的連接。典型的TCP服務端執行如下兩步操作:

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

2、重復執行:

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

2)為返回的Socket實例開啟新的線程,并使用返回的Socket實例的I/O流與客戶端通信;

3)通信完成后,使用Socket類的close()方法關閉該客戶端的套接字連接

繪圖1

3.TCP Demo

Demo1.基本的流發送示例:

服務端開啟一個TCP服務器,參數為端口號

客戶端啟動一個TCP服務,參數為服務端的地址,發送的字符,端口號

 1 import java.net.Socket; 2 import java.net.SocketException; 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.OutputStream; 6  7 public class TCPClient { 8  9     public static void main(String[] args) throws IOException {10 11         if ((args.length < 2) || (args.length > 3))12 13             throw new IllegalArgumentException(14                     "Parameter(s):<Server> <Word> [<Port>]");15 16         String server = args[0]; // Server name or IP address17         /* Convert argument String to bytes using the default character encoding */18         byte[] senddata = args[1].getBytes();19         int servPort = (args.length == 3) ? Integer.parseInt(args[2]) : 7;20         /* Create socket that is connected to server onspecified port*/21         Socket socket = new Socket(server, servPort);22         System.out.TCPClient
 1 import java.net.*; // for Socket, ServerSocket, andInetAddress 2 import java.io.*; // for IOException and Input/OutputStream 3  4 public class TCPServer { 5  6     private static final int BUFSIZE = 32; // Size of receivebuffer 7  8     public static void main(String[] args) throws IOException { 9 10         if (args.length != 1) // Test for correct # of args11             throw new IllegalArgumentException("Parameter(s): <Port>");12 13         int servPort = Integer.parseInt(args[0]);14 15         /* Create a server socket to accept client connection requests */16         ServerSocket servSock = new ServerSocket(servPort);17 18         int recvMsgSize; // Size of received message19         byte[] receiveBuf = new byte[BUFSIZE]; // Receive buffer20 21         while (true) { // Run forever, accepting and servicing connections22 23             Socket clntSock = servSock.accept(); // Get client connection24 25             SocketAddress clientAddress = clntSock.getRemoteSocketAddress();26 27             System.out.println("Handling client at " + clientAddress);28 29             InputStream in = clntSock.getInputStream();30             OutputStream out = clntSock.getOutputStream();31 32             /* Receive until client closes connection, indicated by -1 return*/33 34             while ((recvMsgSize = in.read(receiveBuf)) != -1) {35 36                 out.write(receiveBuf, 0, recvMsgSize);37             }38             clntSock.close(); // Close the socket. We are done with this client!39         }40         /* NOT REACHED */41 42     }43 }
TCPServer

Demo2.

客戶端從控制臺輸入字符串,發送到服務端

服務端受到客戶端的字符串后,加上部分信息(echo字符串)返回到客戶端

 1 package zyb.org.client; 2  3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 import java.io.PrintStream; 7 import java.net.Socket; 8 import java.net.SocketTimeoutException; 9 10 public class Client {11     public static void main(String[] args) throws IOException {12         //客戶端請求與本機在20006端口建立TCP連接 13         Socket client = new Socket("127.0.0.1", 20006);14         client.setSoTimeout(10000);15         //獲取鍵盤輸入 16         BufferedReader input = new BufferedReader(new InputStreamReader(System.in));17         //獲取Socket的輸出流,用來發送數據到服務端  18         PrintStream out = new PrintStream(client.getOutputStream());19         //獲取Socket的輸入流,用來接收從服務端發送過來的數據  20         BufferedReader buf =  new BufferedReader(new InputStreamReader(client.getInputStream()));21         boolean flag = true;22         while(flag){23             System.out.print("輸入信息:");24             String str = input.readLine();25             //發送數據到服務端  26             out.println(str);27             if("bye".equals(str)){28                 flag = false;29             }else{30                 try{31                     //從服務器端接收數據有個時間限制(系統自設,也可以自己設置),超過了這個時間,便會拋出該異常32                     String echo = buf.readLine();33                     System.out.println(echo);34                 }catch(SocketTimeoutException e){35                     System.out.println("Time out, No response");36                 }37             }38         }39         input.close();40         if(client != null){41             //如果構造函數建立起了連接,則關閉套接字,如果沒有建立起連接,自然不用關閉42             client.close();    //只關閉socket,其關聯的輸入輸出流也會被關閉43         }44     }45 }
客戶端代碼Client
 1 package zyb.org.server; 2  3 import java.net.ServerSocket; 4 import java.net.Socket; 5  6 public class Server { 7     public static void main(String[] args) throws Exception{ 8         //服務端在20006端口監聽客戶端請求的TCP連接 9         ServerSocket server = new ServerSocket(20006);10         Socket client = null;11         boolean f = true;12         while(f){13             //等待客戶端的連接,如果沒有獲取連接14             client = server.accept();15             System.out.println("與客戶端連接成功!");16             //為每個客戶端連接開啟一個線程17             new Thread(new ServerThread(client)).start();18         }19         server.close();20     }21 }
服務端代碼Server
 1 package zyb.org.server; 2  3 import java.io.BufferedReader; 4 import java.io.InputStreamReader; 5 import java.io.PrintStream; 6 import java.net.Socket; 7  8 /** 9  * 該類為多線程類,用于服務端10  */11 public class ServerThread implements Runnable {12 13     private Socket client = null;14     public ServerThread(Socket client){15         this.client = client;16     }17     18     @Override19     public void run() {20         try{21             //獲取Socket的輸出流,用來向客戶端發送數據22             PrintStream out = new PrintStream(client.getOutputStream());23             //獲取Socket的輸入流,用來接收從客戶端發送過來的數據24             BufferedReader buf = new BufferedReader(new InputStreamReader(client.getInputStream()));25             boolean flag =true;26             while(flag){27                 //接收從客戶端發送過來的數據28                 String str =  buf.readLine();29                 if(str == null || "".equals(str)){30                     flag = false;31                 }else{32                     if("bye".equals(str)){33                         flag = false;34                     }else{35                         //將接收到的字符串前面加上echo,發送到對應的客戶端36                         out.println("echo:" + str);37                     }38                 }39             }40             out.close();41             client.close();42         }catch(Exception e){43             e.printStackTrace();44         }45     }46 47 }
服務端代碼 線程類 ServerThread

參考文章:

【Java TCP/IP Socket】TCP Socket(含代碼)http://blog.csdn.net/ns_code/article/details/14105457

《Java TCP/IP Socket 編程》


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 万宁市| 尼木县| 五常市| 涟水县| 泌阳县| 石楼县| 确山县| 屯昌县| 丹棱县| 平远县| 外汇| 绥中县| 浦县| 中山市| 凤凰县| 昌邑市| 金溪县| 岳阳市| 静安区| 广宁县| 台南县| 车险| 牡丹江市| 柘城县| 左贡县| 嘉义市| 台中县| 都兰县| 尉犁县| 电白县| 临清市| 余干县| 元朗区| 柘荣县| 勐海县| 扎鲁特旗| 武城县| 上杭县| 开原市| 宁国市| 西峡县|