2017-06-13 70 views
1

我已经实现了Andorid App,它通过套接字(TCP)与服务器端进行通信。当我点击Android应用程序中的按钮时,应用程序和服务器端之间正在建立通信以及正在交换消息。 要再次与服务器通信,我必须再次在Eclipse中运行服务器。我想运行一次服务器端,当clientSocket缓冲区中没有数据时,如果Android用户向服务器发送一个新请求 ,服务器应该再次监听。我试图通过使用Runnable类来管理该请求,但我仍然需要运行Eclipse中的服务器端?我怎样才能使它工作?保持ServerSocket监听客户端

public class Server{ 

    public static void main(String args[]) throws Exception { 
     Cg2AapiServer.startServer(); 

    } 

    private static void startServer() { 

     Runnable serverTask = new Runnable() { 

      @Override 
      public void run() { 
       try { 

        ServerSocket serverSocket = new ServerSocket(27015); 
        Socket clientSocket = serverSocket.accept(); 

        Cg2AapiServer.bufferedInputStream = new BufferedInputStream(clientSocket.getInputStream()); 
        Cg2AapiServer.outputStream = clientSocket.getOutputStream(); 
        Cg2AapiServer.smartCard = new SmartCard(); 
        Cg2AapiServer.handleConnection(); 

        Cg2AapiServer.bufferedInputStream.close(); 
        Cg2AapiServer.outputStream.close(); 
        clientSocket.close(); 
       } catch (IOException e) { 
        System.err.println("Unable to process client request"); 
        e.printStackTrace(); 
       } 
      } 
     }; 
     Thread serverThread = new Thread(serverTask); 
     serverThread.start(); 

     System.out.println("At the end of the startServer method!"); 

    } 


    private static void handleConnection() throws IOException { 
     ByteBuffer receiveBuffer = ByteBuffer.allocate(Cg2AapiServer.RECEIVE_BUFFER_LENGTH); 
     int readBytes = 0; 
     while (true) { 
      readBytes = Cg2AapiServer.bufferedInputStream.read(receiveBuffer.array(), receiveBuffer.position(), 
        receiveBuffer.remaining()); 
      System.out.println("readBytes: " + readBytes); 
      if (readBytes < 0) { 
          // What should I do here when the readBytes = -1 
       Cg2AapiServer.startServer(); //With this line I am getting the error below. 
       break; 
      } 
     } 

} 

错误

无法处理客户端请求java.net.BindException:在 的Java JVM_Bind在 java.net.DualStackPlainSocketImpl.bind0(本机方法):使用地址 已经.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:106) at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:376) at java.net.PlainSocketImpl.bind(PlainSoc (serverSocket.java:190)at java.net.ServerSocket.bind(ServerSocket.java:376)at java.net.ServerSocket。(ServerSocket.java:237)at java.net.ServerSocket。(ServerSocket.java: 128)维持在 java.lang.Thread.run(Thread.java:745 Cg2AapiServer $ 1.run(Cg2AapiServer.java:42))

+0

地址已在使用:JVM_Bind。您需要停止旧的运行服务器,然后运行它。这个错误意味着有些东西已经在您选择的端口号上进行了侦听。 – Sneh

回答

0

要与服务器通信,我再次需要运行再次在Eclipse中的服务器。

不,你不知道。但是,如果你写的代码非常糟糕,那么你可能别无选择,只能这样做。

我怎样才能使它工作?

您可以通过在伟大的interwebz中显示如何使用java套接字设置客户端 - 服务器通信的大量示例之一来获得它的工作。

事实上,甚至还存在关于其他附带问题(例如由于防火墙而无法通信)的stackoverflow的问题,这些问题包含java套接字的完整工作示例代码。例如,这一个:

#1:Simple Java Client/Server Program

相关问题