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

Posted

技术标签:

【中文标题】是否可以同时读取和写入 java.net.Socket?【英文标题】:Is it possible to simultaneousy read from and write into a java.net.Socket? 【发布时间】:2012-06-29 15:14:24 【问题描述】:

是否可以同时从套接字读取和写入?我有一个连续读取套接字的线程。由于只有一个线程正在从套接字读取,因此读取操作是线程安全的。现在我有很多线程(比如 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) 将等待消息。

我想知道在执行inputStream.read(message); 时执行outputStream.write(message); 是否安全

【问题讨论】:

【参考方案1】:

是的,套接字是双向的,并且启用全双工通信,(在不同线程上)同时读写没有问题。

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

【讨论】:

猜测在 SocketManager 类或套接字上同步会产生相同的效果,因为只有一个套接字。 实例化另一个 SocketManager 的那一天,在写入时只会阻塞一个,而不是所有实例。并且在最小对象上同步更加清晰。

以上是关于是否可以同时读取和写入 java.net.Socket?的主要内容,如果未能解决你的问题,请参考以下文章

SDRAM 方向性 - 在“官方”带宽数据中读取和写入计数是不是相同?

在java中同时读取和写入文件

java文件读写

Mnesia:如何同时锁定多行,以便我可以写入/读取一组“一致”的记录

在 C 或 C++ 中的同一个套接字上同时读取和写入

java能否读取csv文件的同时也写入数据?