日期:2014-05-20  浏览次数:20812 次

关于虚拟机与XP主机SOCKET通信的奇怪问题
先代码如下:
server:
 try 
  {
  int i=1;
  ServerSocket server = new ServerSocket(listenPort);
  Socket incomingConnection = null;
  System.out.println("server is ok,wait client request. port="+listenPort);
  while(true)
  {
  System.out.println("wait... ");
  incomingConnection = server.accept(); 
  System.out.println("client request "+i);
  i++;
  handleConnection(incomingConnection);
  }
  }  
...........................

////////////////////////////////////////////////////////////////////////////////////////
client

  System.out.println("begin connection...hostIp="+hostIp+":hostport="+hostPort);
  Socket client = new Socket(hostIp,hostPort);
  // System.out.println("client.isConnected()=" + client.isConnected());
  System.out.println("begin connection......");
  socketReader = new BufferedReader(new InputStreamReader(client.getInputStream()));
  socketWriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())),true); 
  System.out.println("connetc is ok");

////////////////////////////////////////////////////////////////

  System.out.println("send message begin");
  socketWriter.println(fileNameToGet);  
  System.out.println("send message end");
  socketWriter.flush();
  System.out.println("send message flush");
  String line = null;
  System.out.println(socketReader.readLine());
  while((line=socketReader.readLine())!=null)
  System.out.println("line="+line);
  fileLines.append(line+"\n");

////////////////////////////////////////////////////////////////////////

具体情况是:上面代码同时在xp或虚拟机(centos5.5)运行,一切正常。但现在把server代码在虚拟机centos运行,client在XP上运行,显示如下:server:
server is ok,wait client request. port=25888
wait... 

client :
begin connection...hostIp=10.1.14.71:hostport=25888
client.isConnected()=true
begin connection......
connetc is ok
send message begin
send message end
send message flush
java.net.SocketException: Connection reset //这句是等了好长时间才出来。

为何client提示连接上了,server没反应?防火墙关了,而且xp能够与虚拟机互相ping通。






------解决方案--------------------
这可真的不了解,你可能要改变虚拟机的连接方式才行。
------解决方案--------------------
handleConnection

去调试吧,看看是如何返回数据的。
------解决方案--------------------
估计虚拟机运行client,xp运行server也会堵塞
很有可能是println readLine造成的
系统不一样,换行符也不一样,如果系统不能正确读取到换行符,就一直堵塞
可以尝试启动的时候,带上属性设置参数

java -Dline.separator=xxx your_java
------解决方案--------------------
可能是println readLine造成的
系统不一样,换行符也不一样,如果系统不能正确读取到换行符,就一直堵塞
可以尝试启动的
------解决方案--------------------
windows换行是\r\n,十六进制数值是:0D0A。
LINUX换行是\n,十六进制数值是:0A
centos 是LINUX的吧
------解决方案--------------------