gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:53:20 27 4
gpt4 key购买 nike

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

最佳答案

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

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

关于java - 是否可以同时读取和写入 java.net.Socket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11238913/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com