2.2
TCP套接字
2.2.1 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 Address String server = args[0]; // 0.1 获取传输文字的长度 byte[] data = args[1].getBytes(); // 0.2 获取端口号(严格的话要对这里进行一下端口的验证) int serverPort = (args.length == 3) ? Integer.parseInt(args[2]) : 7; // 1.使用指定的服务器和端口创建Socket Socket 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 server out.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端口
执行客户端
再看服务器端