繁体   English   中英

Java TCP套接字消息中断

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM