Java中ServerSocket的用法 详解服务端Socket java server client
serversocket是java中用于监听客户端连接的核心类,其核心使用步骤包括:1. 创建serversocket并绑定端口;2. 调用accept()方法监听并接受连接;3. 通过socket的输入输出流进行通信;4. 关闭资源。为应对高并发,可采用线程池或nio技术提升性能;bind()方法用于指定绑定的ip和端口;backlog控制参数连接请求队列长度;setsotimeout()方法可设置accept()的超时时间。
服务端Socket,说白了,就是Java里ServerSocket这个玩意儿。它监听客户端的连接请求,然后像个老鸨一样,把连接“分配”给其他的Socket去处理。简单来说,ServerSocket负责接客户,真正干活的是接收的Socket。
解决方案
想用好ServerSocket,得先理解它的几个关键步骤:
立即学习“Java免费学习笔记(深入)”;创建ServerSocket:这就好比开店选址,你得指定一个端口号,让客户端能找到你。比如 ServerSocket serverSocket = new ServerSocket(8080);就在8080端口开了个店。监听连接: serverSocket.accept() 这一步很重要,它会阻塞程序,直到有客户端来连接。就像店员在门口等待客人上门。accept()方法会返回一个新的Socket对象,这个Socket就代表了和客户端的连接。处理连接:拿到Socket对象后,就可以通过它的输入输出流和客户端通信了。这部分逻辑可以放在一个新的线程里处理,避免阻塞主线程。关闭连接:通信完毕,记得关闭Socket和ServerSocket,释放资源。不然你的服务器迟早会被耗死。
一个简单的例子:import java.net.*;import java.io.*;public class SimpleServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(8080); System.out.println(quot;服务器在端口 8080quot 上启动;); while (true) { Socket clientSocket = serverSocket.accept(); System.out.println(quot;客户端已连接: quot; clientSocket.getInetAddress().getHostAddress()); // 处理客户端连接,可以放在另一个线程中 new Thread(() -gt; { try ( PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); ) { String inputLine; while ((inputLine = in.readLine()) != null) { System.out.println(quot;已接收: quot; inputLine); out.println(quot;服务器已接收: quot; inputLine); // 回显给客户端 } System.out.println(quot;客户端已断开连接: quot; clientSocket.getInetAddress().getHostAddress()); } catch (IOException e) { e.printStackTrace();
} finally { try { clientSocket.close(); } catch (IOException e) { e.printStackTrace(); } } }).start(); } } catch (IOException e) { System.err.println(quot;无法监听端口: 8080.quot;); System.exit(1); } finally { if (serverSocket != null) { try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } }}登录后复制
这个例子里,服务器会一直监听8080端口,只要有客户端连接,就创建一个新的线程来处理。每个线程读取客户端发来的数据,然后把数据原样返回给客户端。如何处理大量的连接?
单线程的ServerSocket肯定撑不住高承载。一个比较常见的做法是线程使用池。服务器套接字 接受到一个新的连接,就从线程池里抽出一个线程来处理。这样可以避免创建和聚合线程的开销。
另外,还可以考虑使用非阻塞I/O(NIO)。NIO允许一个线程同时管理连接多个,提高了服务器的中断能力。像Netty这样的框架,就是基于NIO实现的。ServerSocket的bind()方法有什么用?
bind()方法用于将ServerSocket绑定到一个特定的地址和端口。如果你没有显式调用bind(),那么在ServerSocket的时候创建系统会自动选择一个可用的端口。
有时候,你可能将ServerSocket绑定到一个特定的IP地址。比如,你的服务器需要多个中断,你希望ServerSocket只监听某个中断上的连接。这个时候,就可以使用bind()方法。
ServerSocket serverSocket = new ServerSocket();SocketAddress socketAddress = new InetSocketAddress(quot;192.168.1.100quot;, 8080);serverSocket.bind(socketAddress);登录后复制
可能代码将ServerSocket绑定到IP地址为192.168.1.100的销毁的8080端口。ServerSocket的积压参数是什么意思?
backlog参数指定了服务器可以接受的最大连接请求队列的长度。当服务器忙于处理其他连接时,新的连接请求会被放入这个队列中等待。如果队列满了,新的连接请求会被拒绝。
backlog参数的值通常由网络决定,不同的网络有不同的默认值。你可以通过 ServerSocket 的构造函数来决定指定 backlog 的值。ServerSocket serverSocket = new ServerSocket(8080, 100); // backlog = 100登录后复制
但是,即使你指定了backlog 的值,也可能会忽略你的设置,使用自己的默认值。如何设置 ServerSocket 的超时时间?
有时候,你可能希望 ServerSocket 在一段时间内没有收到任何连接请求就自动关闭。这个时候,可以设置 ServerSocket 的超时时间。
Java 并没有提供直接设置 ServerSocket 的超时时间的方法。但是,你可以通过设置 Socket 的超时时间来实现类似的效果。ServerSocket serverSocket = new ServerSocket(8080);serverSocket.setSoTimeout(5000); // 设置超时为 5 秒try { Socket clientSocket = serverSocket.accept(); // ...} catch (SocketTimeoutException e) { System.out.println(quot;超时发生";);}登录后复制
可能代码会设置 ServerSocket 的超时时间为 5 秒。如果在 5 秒内没有收到任何连接请求,accept()方法会抛出一个 SocketTimeoutException 异常。
需要注意的是,setSoTimeout() 方法设置 Socket 的超时时间,而不是 ServerSocket 的超时时间。但是,由于accept()方法返回的是一个 Socket 对象,所以设置 Socket 的超时时间可以衍生实现 ServerSocket 的超时效果。
以上就是Java中ServerSocket的实现文章详解服务端Socket的详细内容,更多请关注乐哥常识网相关其他!