在Java中,提供了两个类用于实现TCP通信程序:
1、客户端:Java.net.Socket
类表示。创建Socket对象,向服务端发送连接请求,服务端响应请求,两者建立连接开始通信。
2、服务端:java.net.ServerSocket
类表示。创建ServerSocket对象,相当于开启一个服务,并等待客户端的连接。
Socket类
socket类:该类实现客户端套接字,套接字指的使两台设备之间通讯的端点。
构造方法
public Socket(String host, int port):
创建套接字对象并将其连接到指定主机上的指定端口号。如果指定的host是null,则相当于指定地址为回送地址。(注意:回送地址(127.x.x.x)是本机回送地址,主要用于网络软件测试以及本地机进程间通信,无论什么程序,一旦使用回送地址发送数据,立即返回,不进行任何网络传输)
举例,代码如下:
Socket client = new Socket("127.0.0.1",6666); //连接本地端口为6666的服务器
对应的Server
ServerSocket serverSocket = new ServerSocket(6666);
同时我们要记住,ServerSocket本身是没有获得输入流和输出流的方法的,所以都是通过accpet方法监听客户端获得socket,然后再通过socket的成员方法获得输入流和输入流,完成输入输出操作.
客户端
/*
TCP通信的客户端:向服务器发送连接请求,给服务器
构造方法:
Socket(String host,int port)
成员方法:
OutputStream getOutputStream() 返回此套接字的输出流
InputStream getInputStream() 返回此套接字的输入流
void close() 关闭此套接字
*/
public class TCPClient {
public static void main(String[] args) throws IOException {
//连接端口为8888的本地服务器
Socket socket = new Socket("127.0.0.1",8888);
//使用成员方法获得此套接字的输出流,向服务端发送信息
OutputStream outputStream = socket.getOutputStream();
outputStream.write("你好服务器".getBytes(StandardCharsets.UTF_8));
//使用成员方法获得此套接字的输入流,得到服务端发送的信息并打印
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes);
System.out.println(new String(bytes,0,len));
//关闭socket
socket.close();
}
}
服务端
public class TCPServer {
public static void main(String[] args) throws IOException {
//创建ServerSocket,端口号设置为8888
ServerSocket serverSocket = new ServerSocket(8888);
//监听Socket
Socket socket = serverSocket.accept();
//借用socket的InputStream,输出客户端发送的信息
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = inputStream.read(bytes);
System.out.println(new java.lang.String(bytes,0,len));
//借用socket的OutputStream,返回信息
OutputStream outputStream = socket.getOutputStream();
outputStream.write("收到谢谢".getBytes(StandardCharsets.UTF_8));
//关闭socket与serverSocket
socket.close();
serverSocket.close();
}
}