ServerSocket基础
1.ServerSocket基础
用于监听特定的端口,接收Socket请求
ServerSocket server = new ServerSocket(8080);
管理客户端连接请求是由操作系统控制的,这些连接会存入先进先出的队列中,当然队列有最大限度
backlog参数
ServerSocket构造方法的backlog参数用来设置连接请求队列的长度,但不能超过系统限定的长度
一个示例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <span>// 服务端 2 public static void main(String[] args) throws Exception{ 3 // 创建ServerSocket端口8080,请求队列最大为3 4 ServerSocket server = new ServerSocket(8080,3); 5 // 此时让服务端睡眠6秒,而队列中只能保存3个,所以会报错 6 Thread.sleep(6000); 7 // while(true){ 8 // Socket socket = server.accept(); 9 // System.out.println(socket.getInetAddress()); 10 // } 11 }</span>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <span>// 客户端 2 public static void main(String[] args) throws Exception{ 3 Socket[] sockets = new Socket[100]; 4 // 模拟100个连接 5 for(int i=0;i<100;i++){ 6 sockets[i] = new Socket("192.168.1.11",8080); 7 System.out.println(i+1); 8 } 9 Thread.sleep(3000); 10 // 依次关闭 11 for(int i=0;i<100;i++){ 12 sockets[i].close(); 13 } 14 }</span>
服务端也可绑定固定IP
ServerSocket server = new ServerSocket(8080,
3,InetAddress.getByName("192.168.1.11"));
2.ServerSocket选项
等待客户连接超时SoTimeout
超过时间仍然没有连接,则抛SocketTimeoutException异常
ServerSocket server = new ServerSocket(8080);
server.setSoTimeout(6000);
是否允许重用服务器地址
当ServerSocket关闭时,如果还有数据传入,并不会立即释放端口
如果此时重启,可能会抛BindException异常
if(!server.getResuseAddress()){
server.setResuseAddress(true);
}
需要在绑定端口前设置才能生效
接收数据的缓冲区大小
示例
ServerSocket server = new ServerSocket();
int size = server.getReceiveBufferSize();
server.setReceiveBufferSize(10000);// 单位为字节
server.bind(new InetSocketAddress(8080));
3.ServerSocket的一个示例
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <span>// 业务逻辑的处理放到了线程中 2 class Handler implements Runnable{ 3 4 private Socket socket; 5 public Handler(Socket socket){ 6 this.socket = socket; 7 } 8 9 @Override 10 public void run() { 11 System.out.println("new connection:"+socket.getInetAddress()); 12 try { 13 BufferedReader br = new BufferedReader( 14 new InputStreamReader(socket.getInputStream())); 15 PrintWriter pw = new PrintWriter( 16 new OutputStreamWriter(socket.getOutputStream())); 17 String msg = null; 18 while((msg=br.readLine())!=null){ 19 System.out.println(msg); 20 pw.println("received"); 21 if(msg.equals("88")){ 22 break; 23 } 24 } 25 } catch (IOException e) { 26 e.printStackTrace(); 27 } finally{ 28 if(socket!=null){ 29 try { 30 socket.close(); 31 } catch (IOException e) { 32 e.printStackTrace(); 33 } 34 } 35 } 36 } 37 38 } 39 </span>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <span> private int port = 8080; 2 private ServerSocket server; 3 4 public static void main(String[] args) throws Exception { 5 new EchoServer().service(); 6 } 7 8 public EchoServer()throws Exception{ 9 server = new ServerSocket(port); 10 System.out.println("服务器启动"); 11 } 12 13 // 进来一个用户就分配一个线程 14 public void service(){ 15 while(true){ 16 Socket socket = null; 17 try { 18 socket = server.accept(); 19 Thread thread = new Thread(new Handler(socket)); 20 thread.start(); 21 } catch (IOException e) { 22 e.printStackTrace(); 23 } 24 } 25 }</span>