关于虚拟机与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的吧
[解决办法]
这样不行的,这样是\n字符串
或者你两边都设置同一个字符串,或者你在启动时候,认为用代码设置
System.getProperties().setProperty("line.separator", "\n");
[解决办法]
如果是没连上,修改一下虚拟机和xp的网卡使用模式
[解决办法]
查看一下虚拟机和xp的共享网卡的设置
[解决办法]
如果System.out.println("client request "+i);都没打印的话,就是服务器没收到任何连接请求
虚拟机也有虚拟网卡的,所以应该是配置的问题
另,上面的代码大概看了一眼,
streamWriter.close();
streamReader.close();
最好不要close,这个close会导致整个socket的close,具体可以参考javadoc的文档说明,可以让客户端在整个交互结束后退出时关闭socket就可以了。