各位大侠:
我的问题是用JAVA写了一个Client和Server的Socket数据通讯的项目,Servers端布署在Windows下工作稳定正常的,但是布署在Linux下,就出现数据包延后的问题,困扰一天了,没有解决。情况是这样的,在Linux的服务器端布署好后,Client端发送1,2,3三个包,Server端只收到1,2两个包,当Client端发送下一个包的时候,Linux Server端才收到上一个包,有没有大侠遇到过类似情况呀(Windows下署完全没有问题!),谢谢!
代码如下:
Client:
public boolean sendMessage(SocketMessage message) throws RemoteException {
message.setUserId("001");
if (mSocket == null || mSocket.get() == null) {
return false;
}
Socket socket = mSocket.get();
try {
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
if (!socket.isClosed()) {
String jMessage = Util.initJsonObject(message).toString() + "\n";
/// String jMessage = Util.initJsonObject(message).toString();
writer.write(jMessage);
writer.flush();
sleep(1);
Log.i(TAG, "发送消息:" + jMessage);
sendTime = System.currentTimeMillis();
if (message.getType() == Custom.MESSAGE_EVENT) {
messageListener.updateMessageList(message);
}
} else {
return false;
}
} catch (IOException e) {
e.printStackTrace();
return false;
} catch (InterruptedException e) {
e.printStackTrace();
}
return true;
}
Server:
@Override
public void run() {
super.run();
try {
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
while (isStartServer) {
long interval = System.currentTimeMillis() - lastTime;
if (interval >= (Custom.SOCKET_ACTIVE_TIME * 1000 * 4)) {
System.out.println("客户端发包间隔时间严重延迟,可能已经断开了interval:" + interval);
System.out.println("Custom.SOCKET_ACTIVE_TIME * 1000:" + Custom.SOCKET_ACTIVE_TIME * 1000);
closeSocketClient(this);
break;
}
if (reader.ready()) {
lastTime = System.currentTimeMillis();
System.out.println("收到消息,准备解析:");
String data = reader.readLine();
System.out.println("解析成功了<" + data+">");
SocketMessage from = Util.parseJson(data);
if (userId == null || "".equals(userId))
userId = from.getUserId();
SocketMessage to = new SocketMessage();
if (from.getType() == Custom.MESSAGE_ACTIVE) {
System.out.println("收到心跳包:" + socket.getInetAddress());
to.setType(Custom.MESSAGE_ACTIVE);
to.setFrom(Custom.NAME_SERVER);
to.setTo(Custom.NAME_CLIENT);
to.setMessage("");
to.setUserId(userId);
writer.write(Util.initJsonObject(to).toString() + "\n");
writer.flush();
} else if (from.getType() == Custom.MESSAGE_CLOSE) {
System.out.println("收到断开连接的包:" + socket.getInetAddress());
to.setType(Custom.MESSAGE_CLOSE);
to.setFrom(Custom.NAME_SERVER);
to.setTo(Custom.NAME_CLIENT);
to.setMessage("");
to.setUserId(userId);
writer.write(Util.initJsonObject(to).toString() + "\n");
writer.flush();
closeSocketClient(this);
break;
} else if (from.getType() == Custom.MESSAGE_EVENT) {
System.out.println("收到普通消息包:" + from.getMessage());
}
}
/// Thread.sleep(100);
}
} catch (Exception e) {
e.printStackTrace();
}
}
服务端的LOG信息如下,没有出现错误:
客户端连接成功/192.168.0.167
收到消息,准备解析:
解析成功了<{"message":"Socket-36(0).","type":1,"from":"客户端","to":"服务器","userId":"001"}>
收到普通消息包:Socket-36(0).
收到消息,准备解析:
解析成功了<{"message":"Socket-37(0).","type":1,"from":"客户端","to":"服务器","userId":"001"}>
收到普通消息包:Socket-37(0).
收到消息,准备解析:
解析成功了<{"message":"Socket-38(0).","type":1,"from":"客户端","to":"服务器","userId":"001"}>
收到普通消息包:Socket-38(0).
收到消息,准备解析:
解析成功了<{"message":"Socket-39(0).","type":1,"from":"客户端","to":"服务器","userId":"001"}>
收到普通消息包:Socket-39(0).
收到消息,准备解析:
解析成功了<{"message":"Socket-40(0).","type":1,"from":"客户端","to":"服务器","userId":"001"}>
收到普通消息包:Socket-40(0).