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端口

执行客户端
再看服务器端