是否可以同时读取和写入java.net.Socket?

是否可以同时读取和写入java.net.Socket?,java,multithreading,sockets,socket.io,Java,Multithreading,Sockets,Socket.io,可以从套接字同时读写吗?我有一条线,它不断地读取套接字。由于只有一个线程正在从套接字读取,所以读取操作是线程安全的。现在我有很多线程(比如100个)可以写入套接字。因此很明显,我必须通过这样做使写操作线程安全 package com.mysocketapp.socketmanagement; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.S

可以从套接字同时读写吗?我有一条线,它不断地读取套接字。由于只有一个线程正在从套接字读取,所以读取操作是线程安全的。现在我有很多线程(比如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);
    }
}
现在我有一个线程不断调用readMessage()函数(在while循环中)。据我所知,如果套接字上没有要读取的消息,则语句
inputStream.read(message)
将等待消息


我想知道超过
outputStream.write(message)是否安全
输入流.read(消息)正在执行中

是的,套接字是双向的,可以实现全双工通信,同时执行(在不同线程上)读写操作没有问题


有多个写线程也没有问题。您可以在socket实例上而不是SocketManager类上进行同步。

猜测在SocketManager类或socket上进行同步将具有相同的效果,因为只有一个套接字。在实例化另一个SocketManager的当天,写入时只会阻止一个,而不是所有实例。在最小对象上进行同步更为清晰。