java socket 多线程echo服务器

java socket系列文章
java socket 单线程echo服务器
java socket 多线程echo服务器
java socket 线程池echo服务器

在文章java socket 单线程echo服务器中实现的echo服务器有一个问题,就是Server只能接受一个Client请求,当第一个Client连接后就占据了这个位置,后续Client不能再继续连接。在实际的网络环境里,同一时间只对一个用户服务是不可行的。一个优秀的网络服务程序除了能处理用户的输入信息,还必须能够同时响应多个客户端的连接请求。所以需要做些改动,当Server每接受到一个Client连接请求之后,都把处理流程放到一个独立的线程里去运行,然后等待下一个Client连接请求,这样就不会阻塞Server端接收请求了。每个独立运行的程序在使用完Socket对象之后要将其关闭。

客户端代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.SocketTimeoutException;
public class client {  
    public static void main(String[] args) throws IOException {      
        Socket client = new Socket("127.0.0.1", 20011);  
        //客户端请求与本机在20011端口建立TCP连接 
        client.setSoTimeout(10000);             
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); 
      //获取键盘输入        
        PrintStream out = new PrintStream(client.getOutputStream());          
        //获取Socket的输出流,用来发送数据到服务端                  
        BufferedReader buf =  new BufferedReader(new InputStreamReader(client.getInputStream()));  
//获取Socket的输入流,用来接收从服务端发送过来的数据 
        boolean flag = true;  
        while(flag){  
            System.out.print("输入信息:");  
            String str = input.readLine();  
            out.println(str);  
            //发送数据到服务端   
            if("bye".equals(str)){  
                flag = false;  
            }else{  
                try{  
                    //从服务器端接收数据有个时间限制(系统自设,也可以自己设置),超过了这个时间,便会抛出该异常  
                    String echo = buf.readLine();  
                    System.out.println(echo);  
                }catch(SocketTimeoutException e){  
                    System.out.println("Time out, No response");  
                }  
            }  
        }  
        input.close();  
        if(client != null){  
            //如果构造函数建立起了连接,则关闭套接字,如果没有建立起连接,自然不用关闭  
            client.close(); //只关闭socket,其关联的输入输出流也会被关闭  
        }  
    }  
}  
服务器端代码
public class MultiThreadServer{
    public static void main(String[] args) throws Exception{  
        ServerSocket server = new ServerSocket(20012);  
        Socket client = null;
        while(true){ 
            System.out.println("服务器端等待客户端发起连接请求");     
            client = server.accept();
            System.out.println("客户端向服务器端发起了连接请求,且连接成功");
            new Handler(client);
        }
    }
}

这个程序监听20012端口,并将接受到的客户端请求交给Handler线程运行。Handler线程接受客户端的输入,并将输入返回给客户端,直到客户端输入”bye”,线程结束。

线程处理代码
public class Handler extends Thread{
    private Socket client; 
    PrintStream out;
    BufferedReader buf;
    public Handler(Socket client){
        this.client = client; 
        try {
            out = new PrintStream(client.getOutputStream());
            buf = new BufferedReader(new InputStreamReader(client.getInputStream())); 
            start();
        } catch (IOException e) {
            e.printStackTrace();
        }               
    } 
    public void run(){
         try{                    
             boolean flag =true;  
             while(flag){                
                 String str =  buf.readLine();  
                 if(str == null || "".equals(str)){  
                     flag = false;  
                 }else{  
                     if("bye".equals(str)){  
                         flag = false;  
                     }else{  
                        System.out.println("服务器从客户端接受到的数据:"+str);
                         out.println("echo:" + str);  
                     }  
                 }  
             }  
             out.close(); 
             buf.close();
             client.close();  
         }catch(Exception e){  
             e.printStackTrace();  
         }  
     }      
}

首先运行MultiThreadServer类,然后运行两个Client类,然后分别在每个MyClient的提示符下输入字符串,就可以看到MultiThreadServer
可以分别接收处理每个Client的请求了。


此项目的完整代码可以到我的github,java-socket进行下载。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,680评论 19 139
  • Java Socket编程 对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是...
    天空下天的月亮阅读 2,131评论 10 41
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,869评论 11 349
  • java socket系列文章java socket 单线程echo服务器java socket 多线程ech...
    snoweek阅读 2,120评论 1 9
  • 公交站台上粉嘟嘟的小女孩转着粉红花伞麻花辫忽闪忽闪像极了瓷娃娃真想掠回家
    咕咕羊羊阅读 159评论 0 0

友情链接更多精彩内容