Java 多线程阻塞echo服务器

2 篇文章 0 订阅

当Server端收到一个Client的连接时,新创建一个Thread线程来处理该请求(输入输出)。

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket=new ServerSocket(5555);
        Socket socket=null;
        while (true){
            socket=serverSocket.accept();
            System.out.println("已经接收到客户端连接");
            System.out.println(socket);
            new Handle(socket).start();
        }
    }
}

class Handle extends Thread{
    private Socket socket=null;
    public Handle(Socket socket){
        this.socket=socket;
    }
    public void run(){
        PrintWriter out= null;
        BufferedReader in=null;
        try {
            out = new PrintWriter(socket.getOutputStream(),true);
            in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String message=null;
            while((message=in.readLine())!=null){
                System.out.println("收到:"+message);
                out.println(message.toUpperCase());
                out.flush();
            }
            //关闭连接
            in.close();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
public class Client {
    public static void main(String[] args) throws IOException {
        Logger logger= org.apache.log4j.Logger.getLogger(echo.singleThread.Client.class);
        Socket socket=new Socket("localhost",5555);
        System.out.println(socket);

        PrintWriter out=new PrintWriter(socket.getOutputStream(),true);
        BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        BufferedReader stdIn=new BufferedReader(new InputStreamReader(System.in));
        String inMessage=null;
        while((inMessage=stdIn.readLine())!=null){
            out.println(inMessage);
            System.out.println("Server return:"+in.readLine());
//            in.reset();
            out.flush();
        }
        in.close();
        out.close();
        stdIn.close();
        socket.close();
    }
}

java进程可以创建线程的数量由多个方面决定的:

  • JVM的堆内存的大小
  • Thread的stack大小
  • 系统底层允许创建线程的数量
    系统限制:
    /proc/sys/kernel/pid_max, (32768)
    max_user_process(ulimit -u),
    /proc/sys/vm/max_map_count (65530)
    所以,在默认情况下只能创建3万多个线程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值