一、前言
Socket(套接字)是计算机网络中用于实现进程之间通信的一种机制。它提供了一种统一的编程接口,允许不同的计算机之间通过网络传输数据。套接字是网络编程的基础,它被广泛用于实现各种网络应用,包括Web浏览器、邮件客户端、文件传输等。
二、概念
1、通信模型:
Socket使用客户端-服务器(Client-Server)模型,其中一个进程充当服务器,等待接受客户端的连接请求,而另一个进程充当客户端,通过网络连接到服务器。
2、端口:
在Socket通信中,端口是一个数字,用于标识一个特定的进程。端口的范围是0到65535,其中0到1023是保留端口,一般用于系统服务,而1024到65535是可用于自定义应用的端口范围。
3、IP地址:
IP地址用于标识网络中的设备,分为IPv4和IPv6。IPv4地址通常以点分十进制表示,例如,127.0.0.1是本地主机地址。IPv6则使用冒号分隔的16进制表示。
4、协议:
常见的套接字通信协议有TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)。TCP提供可靠的、面向连接的通信,而UDP是无连接的、不可靠的通信,适用于一些实时性要求较高的应用。
在Socket编程中,通常有两种类型的套接字:服务器套接字和客户端套接字。服务器套接字用于监听连接请求,而客户端套接字用于发起连接请求。通过套接字,进程可以在网络上发送和接收数据,实现进程之间的通信。套接字编程通常涉及套接字的创建、绑定、监听(服务器端)、连接(客户端)、发送和接收数据等操作。
三、简单搭建
在Java中实现TCP Socket编程也是相对简单的,以下是一个简单的例子,包括服务器端和客户端的代码:
1、服务器代码
import java.io.*; import java.net.*; public class TCPServer { public static void main(String[] args) { ServerSocket serverSocket = null; try { // 创建服务器套接字,绑定端口 serverSocket = new ServerSocket(8888); System.out.println("服务器已启动,等待客户端连接..."); // 等待客户端连接 Socket clientSocket = serverSocket.accept(); System.out.println("客户端已连接,地址:" + clientSocket.getInetAddress()); // 获取输入流和输出流 BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); // 接收客户端数据 String receivedMessage = in.readLine(); System.out.println("收到客户端数据: " + receivedMessage); // 发送数据给客户端 out.println("Hello, client!"); // 关闭连接 in.close(); out.close(); clientSocket.close(); serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } }
2、客户端代码
import java.io.*; import java.net.*; public class TCPClient { public static void main(String[] args) { Socket socket = null; try { // 创建客户端套接字,连接服务器 socket = new Socket("localhost", 8888); System.out.println("连接服务器成功."); // 获取输入流和输出流 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); // 发送数据给服务器 out.println("Hello, server!"); // 接收服务器数据 String receivedMessage = in.readLine(); System.out.println("收到服务器数据: " + receivedMessage); // 关闭连接 in.close(); out.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }
以上代码简单地创建了一个TCP服务器端和客户端,服务器端在端口8888上监听客户端的连接请求,接收数据后发送一条欢迎消息。客户端连接到服务器,发送一条消息,然后接收服务器的响应。在实际应用中,你可能需要更多的错误处理和线程管理。