Java对基于TCP的网络通信提供了良好的封装,使用Socket对象封装了两端的通信端口
Socket对象屏蔽了网络的底层细节,允许应用程序将网络连接当成一个IO流
服务器端和客户端使用Socket基于C/S架构进行网络通信的过程:
- 服务器端通过某个端口监听是否有客户端发送Socket连接请求
- 客户端向服务器端发出一个Socket连接请求
- 服务器端调用accept()接收客户端的Socket并建立连接
- 通过调用Scoket对象的getInputStream()/getOutputStream()方法进行服务器与客户端之间的信息交互
- 关闭服务器端和客户端的Socket
Socket:是客户端套接字,用于实现两台计算机之间的通信
ServerSocket:是服务器端套接字,用于监听并接收来自客户端的Socket连接
一、Socket类
Socket:是客户端套接字,用于实现两台计算机之间的通信
构造方法 | 功能 |
new Socket(InetAddress | String host, int port) | 创建连接到指定远程主机和端口号的Socket对象 |
new Socket(InetAddress | String host, int port, InetAddress localAddress, int localPort) | 创建连接到指定远程主机和端口号的Socket对象,并指定本地IP地址和本地端口号 |
|
|
常用方法 | 功能 |
public InetAddress getInetAddress() | 返回连接到远程主机的地址,如果连接失败则返回以前连接的主机 |
public int getPort() | 返回Socket远程连接的端口号 |
public int getLocalPort() | 返回本地连接终端的端口号 |
public InputStrean getInputStream() | 返回一个输入流 |
public OutputStream getOutputStream() | 返回一个输出流 |
public synchronized void close() | 关闭当前Socket连接 |
Socket网络通信步骤:
- 根据指定的IP地址和端口号创建一个Socket对象
- 调用getInputStream()/getOutputStream()进行读入或写出
- 客户端与服务器端根据协议进行交互
- 关闭客户端的Socket
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class SocketDemo {
public static void main(String[] args) {
try {
// 1.根据指定的IP地址和端口号创建一个Socket对象
Socket socket = new Socket("localhost",26868);
System.out.println("客户端启动......");
// 2.读取键盘输入的数据
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
// 3.往服务器发送消息
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bw.write(line);
// 3.关闭相关流和客户端的Socket
bw.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
二、ServerSocket类
ServerSocket:是服务器端套接字,用于监听并接收来自客户端的Socket连接
当客户端发送Socket请求并与服务器端建立连接时,服务器将验证并接收客户端的Socket,从而建立客户端与服务器端的网络虚拟链路,以便数据的传输
构造方法 | 功能 |
new ServerSocket(int port) | 创建一个指定端口的ServerSocket对象 |
new ServerSocket(int port, int backlog) | 创建一个指定端口和连接队列长度的ServerSocket对象,此增加一个改变连接队列长度的参数backlog |
new ServerSocket(int port, int backlog, InetAddress localAddress) | 创建一个指定端口、连接队列长度和IP地址的ServerSocket对象,当机器拥有多个IP地址时,才允许使用InetAddress来指定具体的IP地址 |
|
|
常用方法 | 功能 |
public Socket accept() | 接收客户端的Socket连接请求,如果没有接收到客户端的Socket请求,将一直处于等待状态,从而线程阻塞 |
public InetAddress getInetAddress() | 返回当前ServerSocket对象的地址信息 |
public int getLocalPort() | 返回当前ServerSocket对象的服务端口 |
public void close() | 关闭当前的ServerSocket |
ServerSocket网络通信步骤:
- 根据指定的端口号实例化一个ServerSocket对象
- 调用ServerSocket对象的accept()方法接收客户端发送过来的Socket对象
- 调用Socket对象的getInputStream/getOutputStream()方法来建立与客户端进行交互的IO流
- 服务器与客户端根据协议进行交互
- 关闭服务器端的Socket
- 回到第2步,继续监听下一次客户端发送的Socket请求连接
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerSocketDemo {
public static void main(String[] args) {
try {
// 1.根据指定的端口号创建一个ServerSocket对象
@SuppressWarnings("resource")
ServerSocket serverSocket = new ServerSocket(26868);
System.out.println("服务器启动......");
// 2.接收客户端发送过来的Socket
Socket socket = serverSocket.accept();
// 3.调用相关输入/输出流进行读写
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = br.readLine();
System.out.println("来自客户端的消息:" + line);
// 4.关闭流和Socket
br.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
前面编写的客户端程序SocketDemo与服务器端程序ServerSocket能够形成网络通信,运行时先运行服务器端ServerSocketDemo应用程序,再运行客户端SocketDemo应用程序,显示结果如上述所示,最终客户端应用程序会显示: