0

TCPソケット接続を受け入れ、送信した情報を表示するアプリケーションを作成しています。これは機能します。しかし、クライアントからサーバーに複数回情報を送信できるようにしたいと思いました。今のところ、これが送信方法です。

socketStream = socket.getOutputStream();
to_send.add(new String[][] {{
ips + ":" + socket.getPort(),
System.getProperty("user.name"),
System.getProperty("os.name")
}});

sendData(to_send);

while(!finished) {
 socketStream = socket.getOutputStream();
 oos = new ObjectOutputStream(socketStream);
 oos.writeObject(new String[][] {{"Open","LOL"}});
 oos.flush();
}

-

public void sendData(ArrayList<String[][]> d) {
    try {

        oos = new ObjectOutputStream(socketStream);
        oos.writeObject(d);
        oos.flush();


        System.out.println("Sent: " + to_send.get(0));


    } catch (Exception e) {

        System.out.println(e.toString());
    }
}

このエラーが発生します:

java.net.SocketException: Software caused connection abort: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(Unknown Source)
    at java.net.SocketOutputStream.write(Unknown Source)
    at java.io.ObjectOutputStream$BlockDataOutputStream.drain(Unknown Source)
    at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(Unknown Source)
    at java.io.ObjectOutputStream.writeNonProxyDesc(Unknown Source)
    at java.io.ObjectOutputStream.writeClassDesc(Unknown Source)
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.writeFatalException(Unknown Source)
    at java.io.ObjectOutputStream.writeObject(Unknown Source)
    at Server.<init>(Server.java:57)
    at Server.main(Server.java:26)
4

2 に答える 2

1

のソケットを閉じないでくださいsendData。の外部のコードでクローズを処理する必要がありますsendData

編集:この例外は、リモート側が接続を終了したときに発生する可能性があります。発生する可能性が高いのは、2つObjectOutputStreamのを使用すると、サーバーで例外が発生し、接続が強制的に終了することです。

于 2012-06-04T04:59:19.057 に答える
0

ソケットの使用が終了するまで、出力ストリームを閉じないでください。出力ストリームまたは入力ストリームを閉じると、ソケットが閉じます。

ObjectOutputStreamsまた、複数のとを使用しないでくださいObjectInputStreams。ソケットの寿命の間、両端でそれぞれ1つずつ使用します。そうしないと、に遭遇しStreamCorruptedExceptionsます。これらのものは、構築時にヘッダーを書き込み、期待します。ストリームの途中で新しいヘッダーを開くと、もう一方の端がバーフします。

于 2012-06-04T05:02:28.100 に答える