2013-07-01 73 views
1

嗨,我有一个服务器套接字,它侦听来自客户端套接字的请求,而我的代码似乎没有从其输入流中从客户端套接字发送的数据中检索数据。下面Java Socket服务器没有从客户端套接字接收数据

是服务器套接字代码监听连接和处理请求

public void startlistener() { 
serverSocket = new ServerSocket(PORT); 
      listening = true; 
      thread.start(); 
      Log.print(TAG, "startlistener"); 

     } 

     public void stopListener() { 
      thread.stop(); 
      listening = false; 
      Log.print(TAG, "stopListener"); 
     } 

    public void run() { 
       while (listening) { 
        try { 

         Log.d(TAG, "inside server listener loop"); 
         Socket accept = serverSocket.accept(); 

         String data = getData(accept); 

         httpHandler.handleRequest(data, accept); 

        } catch (Exception e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 

    private String getData(Socket socket) throws IOException { 
      InputStream in = socket.getInputStream(); 
      Log.print(TAG, "getData"); 
      int c = 0; 

      StringBuffer buffer = new StringBuffer(); 
    //goes as far as here and then freezes/doesnt retrieve anything from the input stream 
      while ((c = in.read()) != -1) { 
       buffer.append((char) c); 
      } 
      return buffer.toString(); 

     } 

这里是我的测试用例

private static final String HTTP_REQUEST = "HTTP/1.0 408 Request Time-out" 
     + newLine + "Cache-Control: no-cache" + newLine 
     + "Connection: close" + newLine + "Content-Type: text/html"; 

public void testSocketConnection() { 

     try { 
      httpProxy = new HttpProxy(testHttpHandler); 
      httpProxy.startlistener(); 
      testSocket = new Socket("localhost", HttpProxy.PORT); 
      OutputStream outputStream = testSocket.getOutputStream(); 
      InputStream inputStream = testSocket.getInputStream(); 

      outputStream.write(HTTP_REQUEST.getBytes()); 
} catch (UnknownHostException e) { 
      httpProxy.stopListener(); 
      e.printStackTrace(); 
      fail(e.toString()); 
     } catch (IOException e) { 
      httpProxy.stopListener(); 
      e.printStackTrace(); 
      fail(e.toString()); 
     } 


} 

回答

2

您的客户端不关闭套接字。您的服务器读取套接字直到EOS,由于您的客户端没有关闭套接字,它将永远不会到达。

NB在接受线程中不处理客户端I/O。开始一个单独的线程。

+0

ok,只要我在客户端调用socket.write()。我应该在适当的时候关闭套接字? – jonney

+0

每当你想让接收环路停止。或者,更改接收循环。查看DataOutputStream和DataInputStream的方法,如果您想知道如何在保持套接字打开的情况下发送数据。或者,使用对象序列化,XML等。 – EJP

相关问题