1.Socket简介
Java Socket是一种网络通信机制,它使用TCP/IP协议来实现网络中的设备之间的数据传输。Java通过java.net
包提供了对Socket编程的支持。以下是Java Socket编程的一些基本概念和步骤:
基本概念
-
Socket(套接字):Socket是网络通信的端点。它是一个抽象层,它将底层网络通信的细节隐藏起来,为开发者提供了一个简单易用的接口。
-
ServerSocket(服务器套接字):用于服务器端,监听特定端口上的连接请求。当一个客户端尝试连接服务器时,
ServerSocket
会创建一个新的Socket
对象来处理这个连接。 -
Socket(客户端套接字):用于客户端,用于与服务器建立连接。
-
TCP/IP协议:是一组用于不同类型计算机网络之间进行通信的协议,TCP负责在网络中传输数据包,确保数据正确无误地到达目的地,而IP协议负责定位网络上的设备。
2.client端实现
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.Socket;public class Client {public static void main(String[] args) throws Exception{Socket socket = new Socket();socket.connect(new InetSocketAddress("127.0.0.1",9999));System.out.println("连接服务成功,开始数据传输!!!");//向服务端写入数据BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write("请求获取当前时间\n");bw.flush();BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));System.out.println("读取到服务端的响应是:"+br.readLine());//关闭资源bw.close();br.close();socket.close();}}
3.Server端实现
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Server {/*** 创建线程池,用于处理客服端连接的请求*/static ExecutorService threadPool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");public static void main(String[] args) throws Exception{ServerSocket serverSocket = new ServerSocket();final int port = 9999;//绑定端口serverSocket.bind(new InetSocketAddress(port));System.out.println("当前服务监听的端口是:"+port);while (true){//监听获取到的请求,为了防止请求过大,一般会采用多线程的处理机制Socket socket = serverSocket.accept();threadPool.execute(()->{try {//打开输入流,获取到客户端传入的请求参数BufferedReader inputStream = new BufferedReader(new InputStreamReader(socket.getInputStream()));System.out.println("客户端发送的请求是:"+inputStream.readLine());BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));//由于演示读取是按照一行一行的操作进行,所以需要通过换行符标识句尾bufferedWriter.write("当前时间是:"+format.format(new Date())+"\n");bufferedWriter.flush();inputStream.close();bufferedWriter.close();socket.close();} catch (Exception e) {throw new RuntimeException(e);}});}}}
4.总结
Java Socket是Java网络编程中一个非常核心的概念,它提供了一套API来实现基于TCP/IP协议的网络通信。以下是Java Socket的简要总结:
-
Socket(套接字):是网络通信的端点,用于标识网络上的两个点之间的连接。
-
ServerSocket:用于服务器端,监听特定端口上的连接请求,并为每个请求创建一个新的Socket来处理。
-
Socket:用于客户端,用于建立与服务器的连接。
-
TCP/IP协议:确保数据在网络中可靠传输的协议。
-
服务器端:
- 创建
ServerSocket
并监听端口。 - 使用
accept
方法等待客户端连接。 - 获取输入输出流进行数据交换。
- 关闭连接。
- 创建
-
客户端:
- 创建
Socket
并连接到服务器。 - 获取输入输出流进行数据交换。
- 关闭连接。
- 创建
-
数据传输:通过输入输出流(
InputStream
和OutputStream
)在客户端和服务器之间进行数据的发送和接收。 -
多线程:为了同时处理多个客户端,服务器端通常采用多线程技术。
-
异常处理:网络编程需要妥善处理各种网络异常。
-
资源管理:确保所有网络资源(如流和套接字)在使用完毕后被正确关闭。
Java Socket编程是构建网络应用程序的基础,无论是客户端还是服务器端应用程序,都可以通过这套API实现数据的发送和接收。