4

ソケットから同時に読み書きすることは可能ですか? ソケットを継続的に読み取るスレッドがあります。ソケットから読み取るスレッドは 1 つだけなので、読み取り操作はスレッドセーフです。今、私はソケットに書き込む多くのスレッド (たとえば 100) を持っています。したがって、次のようなことを行うことで、書き込み操作をスレッドセーフにする必要があることは明らかです。

package com.mysocketapp.socketmanagement;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class SocketManager {

    private Socket socket = null;

    private InputStream inputStream = null;

    private OutputStream outputStream = null;

    public SocketManager() {
        socket = new Socket("localhost", 5555);
        //server's running on same machine on port 5555
        inputStream = socket.getInputStream();

        outputStream = socket.getOutputStream();
    }

    public void writeMessage(byte[] message) throws IOException {

        synchronized (SocketManager.class) {

            if (message != null) {
                outputStream.write(message);
            }
        }
    }

    public byte[] readMessage() throws IOException {
        byte[] message = new byte[10]; //messages are of fixed size 10 bytes
        inputStream.read(message);
    }
}

これで、(while ループで) readMessage() 関数を常に呼び出すスレッドができました。私が知る限り、ソケットに読み取られるメッセージがない場合、ステートメントinputStream.read(message)はメッセージを待ちます。

outputStream.write(message);実行中inputStream.read(message);に実行しても安全か知りたい

4

1 に答える 1

5

はい、ソケットは双方向であり、全二重通信を有効にします。(異なるスレッドで) 同時読み取りと書き込みを行うことに問題はありません。

また、書き込みスレッドが複数あっても問題ありません。SocketManager クラスではなく、ソケット インスタンスで同期できます。

于 2012-06-28T06:12:22.173 に答える