ServerSocket基础

 1.ServerSocket基础
      用于监听特定的端口,接收Socket请求
      ServerSocket server = new ServerSocket(8080);
      管理客户端连接请求是由操作系统控制的,这些连接会存入先进先出的队列中,当然队列有最大限度
      backlog参数
           ServerSocket构造方法的backlog参数用来设置连接请求队列的长度,但不能超过系统限定的长度
  一个示例:

View Code
 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>
View Code
 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的一个示例

View Code
 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>
View Code
 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>

 

posted @ 2013-04-26 08:16  轻云沉峰  阅读(456)  评论(0编辑  收藏  举报