java TCP套接字消息中断

时间:2011-09-27 19:43:04

标签: java sockets tcp

我在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中完成了套接字数据传输多次,并且我编写了许多读/写方法来处理套接字。这是我第一次碰到这个。

虽然在原始代码中我设置了编码(在发布的代码中我没有),我相信问题是编码相关的。在某一点上,收到的消息每隔一个字符丢失。之后我改变了一下,消息的第一个/第二个字符是在一个单独的消息中收到的。从我的理解,它是一个编码问题或在消息发送者机器上运行的一些防火墙/其他安全程序,决定过滤传出的数据包。

3 个答案:

答案 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);
    }