[英]java TCP socket message breaks
我在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
这可能是编码相关的问题吗?
分隔符为(char)0套接字超时为20000(即20秒)。 每隔10秒,我会发送一条空消息以确保套接字不会关闭
编辑:尽管使用扫描仪解决了该问题,但我必须说,原始代码在很长一段时间(几周)内对许多消息/各种机器都能正常工作,然后突然无法在一台特定机器上处理一条特定消息(其他消息也很好)。 我已经在Java中进行了很多次套接字数据传输,并且编写了许多读/写方法来处理套接字。 这是我第一次遇到这个问题。
尽管在原始代码中我设置了编码(在发布的代码中我没有设置),但我认为问题与编码有关。 在某一时刻,收到的消息每隔第二个字符就会丢失。 之后,我对其进行了一些更改,并且该消息的第一个/第二个字符是在单独的消息中接收到的。 据我了解,这是编码问题或邮件发件人计算机上运行的某些防火墙/其他安全程序决定过滤传出数据包。
尝试用扫描仪代替接收器,让它为您完成工作。
// in your setup
Scanner sc = new Scanner(_in).useDelimiter(Connection.DELIMETER);
public String receive() {
try {
return sc.next();
} catch(IOException e) {
return "";
}
}
首先,我将确保您在这些catch块中打印异常。
然后,您将使用平台默认编码将字符转换为字节。 如果这两个进程在不同的计算机上运行,则可能使用不同的编码。 我将确保在设置Reader和Writer时指定编码。
您可以使用UTF编码来获取消息的完整字符串。
您可以尝试使用此代码,我可以确定此代码,因为我在“我的聊天”应用程序中使用了它。
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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.