客户端:
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();
}
因为想实现在保持socket连接状态下,实现服务端和客户端的互相通信,结果发现,当服务端接收到socket读取数据时,在readline处发现了阻塞的情况,通过查询资料后发现,readline在接收结束信号后才会停止读取数据,这就意味着需要客户端调用close()或者shutdownOutput()时才能够时当前readline()停止。解决办法
1、每次接收只调用一次readline(不加while循环)
2、使用read()方法,加大buff的内存一次性将数据读取出来
3、为一个socket建立线程,服务端修改后代码如下
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();
}