2011-05-20 69 views
0

我正在写我的第一个套接字项目,我有一个问题。当客户端向服务器发送字符串时,服务器无法获得此消息。为什么此套接字程序不传输数据?

public class ClientActivity { 

    public static final String serverIP = "127.0.0.1"; 
     private Socket clientSocket = null; 
     private static BufferedOutputStream out = null; 

    public static void main(String[] args) throws IOException { 
     ClientActivity me = new ClientActivity(); 
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
     out.write("Some string"); 
    } 

    public ClientActivity() throws UnknownHostException, IOException { 
      clientSocket = new Socket(serverIP, serverPort); 
      out = new BufferedOutputStream(clientSocket.getOutputStream()); 
    } 
} 

这里是服务器的代码:

public class DataTransferServer { 

    private ServerSocket serverSocket; 
    private ArrayList<DataReaderThread> workingThreads; 
    private Boolean isListening; 
    private Thread listener; 

    public static void main(String[] args) throws IOException { 
     new DataTransferServer(IProtocolConstants.SERVER_PORT).startServer(); // FIXME 
    } 

    public DataTransferServer (int port) throws IOException { 
     System.out.println("Launch"); 
     serverSocket = new ServerSocket(port); 
     workingThreads = new ArrayList<DataReaderThread>(); 
     isListening = true; 
     listener = new ConnectionListener(); 
    } 

    public void startServer() throws IOException { 
     listener.start(); 
    } 

    private class ConnectionListener extends Thread { 
     @Override 
     public void run() { 
      DataReaderThread newThread = null; 
      while (isListening) { 
       try { 
        newThread = new DataReaderThread(serverSocket.accept(), DataTransferServer.this); 
        newThread.start(); 
        workingThreads.add(newThread); 
        System.out.println("! thread started"); 
       } catch (IOException e) { 
        e.printStackTrace(); // FIXME 
       } 
      } 
      if (newThread != null) { 
       newThread.interrupt(); 
       newThread = null; 
      } 
     } 
    } 


} 

这里是听众:

public class DataReaderThread extends Thread { 
    private Socket socket = null; 
    private BufferedInputStream in = null; 
    private byte[] stuffBytes = null; 

    public DataReaderThread(Socket socket) throws IOException { 
     super("DataReaderThread"); 
     this.socket = socket; 
     in = new BufferedInputStream(socket.getInputStream()); 
stuffBytes = new byte[10]; 
    } 

    public void run() { 
     try { 
      while (in.read(stuffBytes, 0, stuffBytes.length) != -1) { 
System.out.println("Received data:" + new String(stuffBytes)); 
      } 
      in.close(); 
      socket.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public Socket getSocket() { 
     return socket; 
    } 
+0

当静态main引用'out'(它是ClientActivity me实例中的成员)时,您如何获得ClientActivity编译? – Andrew 2011-05-20 21:44:30

+0

对不起,我的失败,编辑 – davs 2011-05-20 21:46:34

回答

3

我猜BufferedOutputStream out在缓冲区满之前不会发送TCP数据包。

尝试调用writeflush将数据立即发送:

out.write("Some string"); 
out.flush(); 

您也可以考虑使用PrintWriter类,而不是,它有一个自动冲洗机制。

+0

非常感谢!但在将来我想发送byte [] ....所以我不能使用PrintWriter来处理我的情况(因为它至少可以传递char [],String ...) – davs 2011-05-20 21:44:51

2

-1发布前编译代码...

public class ClientActivity { 

    public void write(String data) { 
     out.write(data.getBytes()) 
     out.flush() 
    } 

    public static final String serverIP = "127.0.0.1"; 
     private Socket clientSocket = null; 
     private BufferedOutputStream out = null; 

    public static void main(String[] args) throws IOException { 
     ClientActivity me = new ClientActivity(); 
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
     me.write("Some string"); 
    } 

    public ClientActivity() throws UnknownHostException, IOException { 
      clientSocket = new Socket(serverIP, serverPort); 
      out = new BufferedOutputStream(clientSocket.getOutputStream()); 
    } 
}