使用writeBytes的Java客户端套接字

时间:2012-02-18 14:08:36

标签: java sockets

我正在从缓冲区读取一个字符串并将其写入服务器。我遇到的问题是,当我打开套接字并循环写入时,服务器永远不会收到字符串。 当我使用它时:

    try {       
        Socket send = new Socket("localhost", 1490);
        DataOutputStream out = new DataOutputStream(send.getOutputStream());
        String message = null;
        while ((message = buffer.get()) != null){
            out.writeBytes(message);
        }
        out.close();
        send.close();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

服务器没有收到字符串,但是当我这样做时它可以正常工作:

    try {       

        String message = null;
        while ((message = buffer.get()) != null){
            Socket send = new Socket("localhost", 1490);
            DataOutputStream out = new DataOutputStream(send.getOutputStream());
                    out.writeBytes(message);
            out.close();
            send.close();
        }

    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

显然,我不想继续打开和关闭套接字。有什么问题?

3 个答案:

答案 0 :(得分:1)

每次要发送数据包时都需要刷新套接字。 关闭套接字会强制自动刷新,这解释了为什么数据在套接字关闭时发送。

答案 1 :(得分:0)

即使关闭数据,数据也没有写入套接字? (在你的第一个片段中)

另外,您是否尝试过使用 flush 方法?你可以在这里阅读:http://docs.oracle.com/javase/1.4.2/docs/api/java/io/DataOutputStream.html#flush(),你的代码如下:

try {       
    Socket send = new Socket("localhost", 1490);
    DataOutputStream out = new DataOutputStream(send.getOutputStream());
    String message = null;
    while ((message = buffer.get()) != null){
        out.writeBytes(message);
        out.flush();
    }
    out.close();
    send.close();
} catch (IOException ex) {
    ex.printStackTrace();
}

答案 2 :(得分:0)

让我猜一下。

buffer.get()方法会阻止吗?如果是这样,那么问题是out.writeBytes(message)不能保证将整个字节表示推送到服务器。代替。您的客户端很可能有缓冲的字节等待刷新到服务器。

如果这是正在发生的事情,那么在每次调用writeBytes后调用flush将解决问题。

但是如果buffer.get()方法没有阻塞,那么调用flush将没有任何区别。实际上,它只会增加网络流量。所以添加同花顺“以防万一”是一个坏主意。


另一种可能性是服务器端代码有问题。