当前位置: 代码迷 >> J2SE >> socket为什么小弟我第二次回车的时候才返回前一次应该返回的内容
  详细解决方案

socket为什么小弟我第二次回车的时候才返回前一次应该返回的内容

热度:70   发布时间:2016-04-24 00:20:55.0
socket为什么我第二次回车的时候才返回前一次应该返回的内容
如题,而且最后输入end结束的时候还要报Software caused connectionabort: socket write error这个错
代码如下
服务端代码
Java code
import java.io.*;   import java.net.*;     public class Server {   public static void main(String[] args) throws IOException{   ServerSocket server=new ServerSocket(5678);   Socket client=server.accept();   BufferedReader in=  new BufferedReader(new InputStreamReader(client.getInputStream()));   DataOutputStream out=new DataOutputStream(client.getOutputStream());while(true){   String str="Your input is:"+in.readLine();   System.out.println(str);  if(str.equals("end"))  { break;   }    byte[] b=str.getBytes();out.write(b,0,b.length);   out.flush();   }in.close();out.close();client.close();   }   }  


客户端代码
Java code
import java.net.*;   import java.io.*;     public class Client{   static Socket server;     public static void main(String[] args)throws Exception{   server=new Socket(InetAddress.getLocalHost(),5678);   DataInputStream in = new  DataInputStream(server.getInputStream());PrintWriter out=new PrintWriter(server.getOutputStream());   BufferedReader wt=new BufferedReader(new InputStreamReader(System.in));   while(true){   String str=wt.readLine();   out.println(str);   out.flush();   if(str.equals("end")){   break;   }  byte[]  b    = new byte[in.available()];for(int i = 0;i < b.length;i++){     b[i] = (byte)in.read(); } String s = new String(b);System.out.println(s);   }   in.close();out.close();wt.close();server.close();   }   }   


------解决方案--------------------
Server类while里面
String str="Your input is:"+in.readLine();
System.out.println(str);

if(str.equals("end")) { 
break;
}
这里永远不可能成立

换成下面试试
String str = in.readLine();
System.out.println( "Your input is:"+str);

if (str.equals("end"))
{
break;
}
------解决方案--------------------
按照上面的改了之后并没有问题
第二次回车才看到第一次的内容的原因很简单,你是再发送完了之后读取服务器返回的东西,但是太快了,所以你发送完第一次的之后没等到服务端返回的了,你可以在客户端发送完之后让线程sleep一会儿,就会看到效果了,在if...break的后面加一句 
Thread.currentThread().sleep(100);
  相关解决方案