我在java中有一个java客户端服务器应用程序,它们都使用包含发送/接收消息的相同连接类。 出于某种原因,我发送的一些消息是以错误的顺序收到的:
这是代码
//set up
_in = new BufferedReader(new InputStreamReader(this._socket.getInputStream()));
_out = new BufferedWriter(new OutputStreamWriter(this._socket.getOutputStream()));
this._socket.setSoTimeout(S_TIMEOUT);
public synchronized boolean send(String message){
try {
_out.write(message);
_out.write(Connection.DELIMITER);
_out.flush();
return true;
} catch (IOException e) {
}
return false;
}
public String receive(){
int c;
try {
String message = "";
System.out.println("Getting message:");
c = _in.read();
while(c != -1 && c != Connection.DELIMITER) {
message += (char) c;
c = _in.read();
}
if (c == -1) {
return null;
}
return message;
} catch (IOException e) { }
return null;
}
某些消息,例如“new_order”可能会返回“ew_ord”。 一些字符丢失,其他字符分开发送。这看起来很奇怪,因为它的TCP
这可能是编码相关的问题吗?
分隔符是(字符)0 套接字超时为20000(即20秒)。每隔10秒我发送一条空信息以确保套接字不关闭
编辑: 虽然它是使用扫描仪解决的,但我必须说原始代码在很长一段时间(几周)内适用于许多消息/各种机器,然后突然无法在一台特定机器上使用一条特定消息(其他消息通过很好)。我已经在java中完成了套接字数据传输多次,并且我编写了许多读/写方法来处理套接字。这是我第一次碰到这个。
虽然在原始代码中我设置了编码(在发布的代码中我没有),我相信问题是编码相关的。在某一点上,收到的消息每隔一个字符丢失。之后我改变了一下,消息的第一个/第二个字符是在一个单独的消息中收到的。从我的理解,它是一个编码问题或在消息发送者机器上运行的一些防火墙/其他安全程序,决定过滤传出的数据包。
答案 0 :(得分:4)
尝试使用扫描仪替换您的接收,并让它为您完成工作。
// in your setup
Scanner sc = new Scanner(_in).useDelimiter(Connection.DELIMETER);
public String receive() {
try {
return sc.next();
} catch(IOException e) {
return "";
}
}
答案 1 :(得分:0)
对于初学者,我会确保你在那些捕获块中打印异常。
然后,您使用平台默认编码将字符转换为字节。如果这两个进程在不同的机器上运行,那么它们可能使用不同的编码。我会确保在设置Reader and Writer时指定编码。
答案 2 :(得分:0)
您可以使用UTF编码获取完整的消息字符串。
你可以尝试这段代码而且我肯定关于这段代码,因为我在My Chat Application中使用它。
String data=" ";
socket = new Socket("localhost",999);
while(true)
{
dos = new DataOutputStream(socket.getOutputStream());
dis = new DataInputStream(socket.getInputStream());
data = dis.readUTF();
jta.append(data +"\n");
}
其中jta是JTextArea。
适用于客户端
现在服务器端:
try
{
server = new ServerSocket(999);
Socket soc = server.accept();
while(true)
{
String data="";
try
{
dis = new DataInputStream(soc.getInputStream());
dos = new DataOutputStream(soc.getOutputStream());
data = dis.readUTF();
}
catch(Exception e)
{ }
jta.append(data + "\n");
}
}
catch (IOException e)
{
JOptionPane.showMessageDialog(this, e);
System.exit(-1);
}