《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):  []");
		}

		// 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. 调用ServerSocketaccept()方法以获取下一个客户端连接。基于新建立的客户端连接,创建一个Socket实例,并由accept()方法返回。

b. 使用所返回的Socket实例的InputStreamOutputStream与客户端进行通信。

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:");
		}
		
		// 获取服务器的端口
		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端口


执行客户端


再看服务器端



你可能感兴趣的:(TCP/IP,Socket,Java)