2.2
TCP通訊端
2.2.1 TCP用戶端
TCP用戶端的步驟
1.建立一個Socket執行個體:構造器向指定的遠程主機和連接埠建立一個TCP串連。 2. 通過通訊端的輸入輸出資料流(I/O streams)進行通訊:一個Socket串連執行個體包括一個InputStream和一個OutputStream,它們的用法同於其他Java輸入輸出資料流。 3. 使用Socket類的close()方法關閉串連。 |
下面是一個用於回顯的TCP用戶端的代碼
package com.suifeng.tcpip.chapter2;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.net.SocketException;import java.net.UnknownHostException;/** * TCP用戶端 * @author Suifeng * */public class TCPEchoClient{public static void main(String[] args) throws UnknownHostException,IOException{if (args.length < 2 || args.length > 3){throw new IllegalArgumentException("Parameter(s):<Server> <Word> [<Port>]");}// SerName or IP AddressString server = args[0];// 0.1 擷取傳輸文字的長度byte[] data = args[1].getBytes();// 0.2 擷取連接埠號碼(嚴格的話要對這裡進行一下連接埠的驗證)int serverPort = (args.length == 3) ? Integer.parseInt(args[2]) : 7;// 1.使用指定的伺服器和連接埠建立SocketSocket socket = new Socket(server, serverPort);System.out.println("Connected to server ..... Sending echo String");// 2.輸入/輸出InputStream in = socket.getInputStream();OutputStream out = socket.getOutputStream();// Sending encode string to serverout.write(data);int totalBytesLength = 0;int bytesRcvd;while (totalBytesLength < data.length){// 阻塞等待伺服器端的返回if ((bytesRcvd = in.read(data, totalBytesLength, data.length- totalBytesLength)) == -1){throw new SocketException("Connection closed prematurely");}totalBytesLength += bytesRcvd;}System.out.println("Received:"+new String(data));// 3.關閉socket.close();}}
2.2.2 TCP伺服器端
TCP伺服器執行的步驟
1. 建立一個ServerSocket執行個體並指定本地連接埠。此通訊端的功能是偵聽該指定連接埠收到的串連。 2. 重複執行: a. 調用ServerSocket的accept()方法以擷取下一個用戶端串連。基於建立立的用戶端串連,建立一個Socket執行個體,並由accept()方法返回。 b. 使用所返回的Socket執行個體的InputStream和OutputStream與用戶端進行通訊。 c. 通訊完成後,使用Socket類的close()方法關閉該用戶端通訊端串連。 |
下面是一個用於回顯的TCP的伺服器端的代碼
package com.suifeng.tcpip.chapter2;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;import java.net.SocketAddress;public class TCPEchoServer{private static final int BUFFER_SIZE = 128;public static void main(String[] args) throws IOException{if(args.length != 1){throw new IllegalArgumentException("Parameter:<Port>");}// 擷取伺服器的連接埠int serverPort = Integer.parseInt(args[0]);// 建立用於用戶端串連的SocketServer執行個體ServerSocket server = new ServerSocket(serverPort);System.out.println("Server has started!!!!");int recvMsgSize = 0;byte[] recvBuf = new byte[BUFFER_SIZE];while(true){System.out.println("Waiting from client connectting!!!");// 阻塞等的用戶端的串連Socket socket = server.accept();// 用戶端的地址資訊SocketAddress address = socket.getRemoteSocketAddress();System.out.println("Handling client at "+address+"\n");InputStream in = socket.getInputStream();OutputStream out = socket.getOutputStream();while((recvMsgSize = in.read(recvBuf)) != -1){out.write(recvBuf,0,recvMsgSize);}socket.close();}}}
先啟動伺服器端,監聽39393連接埠
執行用戶端
再看伺服器端