ブロッキング溶液中に、クライアントの結果のソケットのチャットルームはreadlineのが表示されたら

クライアント:

	  String val=req.getParameter("text").toString();
		  String id=req.getParameter("id");
		  Socket socket =null; 
		  if(id==null||id.equals("")){
			  socket= new Socket("127.0.0.1",8090);
			  id=socketFactory.getNewId()+"";
			  socketFactory.add(Integer.parseInt(id), socket);
		  }else{
			  socket=socketFactory.get(Integer.parseInt(id));
			
		  }
		  OutputStream os=socket.getOutputStream();
		  //向页面传递
		  PrintWriter write=new PrintWriter(resp.getOutputStream());
		  write.write(id);

		  //向服务端传递
		  PrintWriter swrite=new PrintWriter(os);
		  swrite.println("i am client"+id+":"+val);
 	   	  write.close();
// 		 swrite.close();
// 	     	os.close();
//		  os.flush();
		  swrite.flush();
//		  write.flush();


 

サーバー:

		 ServerSocket serversocket=new ServerSocket(8090);
		 for(int i=0;i<10;i++){
		 Socket socket=serversocket.accept();
		 System.out.println("获取到请求"); 
		 BufferedReader bread=new BufferedReader(new InputStreamReader(socket.getInputStream()));
		 StringBuilder msg=new StringBuilder();
		 String str=null;
		 while((str=bread.readLine())!=null&&str.length()>0){
			msg.append(str);
		 }
		 
     
		  System.out.print(msg);
		  PrintWriter write= new PrintWriter(socket.getOutputStream());
		  write.write("您好 我是服务端");  //服务端回应
		  write.flush();
		 }

私たちは互いに通信サーバとクライアントを達成するために、ソケットの接続状態を維持しながら、達成したい、とサービスは、データを読み込むためのソケットを受信したときに、ことがわかったので、データを照会することにより、背面にreadlineのを阻止するの状況はreadlineので見つかったことがわかりました終了信号を受信した後、クライアントは、(近い呼び出しことを意味し、データの読み出しを停止する)またはshutdownOutputう(のみ)と、現在のreadline()が停止することができます。ソリューション

(whileループなし)1、各受信つのみコールのreadline

図2は、read()メソッドを使用して、ワンタイム増加バフメモリデータから読み出し

次のように図3に示すように、ソケットのスレッドの確立は、サーバーの後にコードを変更します

 

 ServerSocket serversocket=new ServerSocket(8090);
   ExecutorService exec=Executors.newCachedThreadPool();
   for(int i=0;i<10;i++){
   Socket socket=serversocket.accept();
   exec.execute(new Runnable() {  //启用线程
   
   @Override
   public void run() {
    // TODO Auto-generated method stub

     System.out.println("获取到请求"); 
     BufferedReader bread;
    try {
     bread = new BufferedReader(new InputStreamReader(socket.getInputStream()));
      
      String str=null;
      while((str=bread.readLine())!=null){
       
        System.out.println(str);
      }
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
  });
    PrintWriter write= new PrintWriter(socket.getOutputStream());
    write.write("您好 我是服务端");  //服务端回应
    write.flush();
   }


 

 


 

おすすめ

転載: blog.csdn.net/mxy88888/article/details/71629857