2012-06-28 39 views
3

是否可以同時讀寫套接字?我有一個連續讀取套接字的線程。由於只有一個線程正在從套接字讀取,讀操作是線程安全的。現在我有很多線程(比如100)寫入socket。因此,很明顯,我已經做寫操作線程安全的做這樣的事情,是否有可能同時讀取和寫入java.net.Socket?

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)將等待消息。

我想知道它是否是安全的exceute outputStream.write(message);inputStream.read(message);是在執行

回答

5

是的,一個插座是雙向的,使全雙工通信,就做沒問題(在不同的線程)的併發讀取和寫。

而且有多個寫入線程沒有問題。您可以在套接字實例而不是SocketManager類上同步。

+1

猜測在SocketManager類或套接字上的同步會有相同的效果,因爲只有一個套接字。 – HariShankar

+4

當您實例化另一個SocketManager時,只有一個在寫入時被阻塞,而不是所有實例。在最小的對象上進行同步更爲明顯。 –