《Java TCP/IP Socket编程》读书笔记(3)
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端口

执行客户端
再看服务器端