【问题标题】:Server socket has to be wait for client's next command java服务器套接字必须等待客户端的下一个命令 java
【发布时间】:2016-09-03 13:31:26
【问题描述】:

我正在制作一个简单的客户端服务器应用程序。在哪个客户端将关闭,重新启动命令发送到服务器。但是如何为客户端的下一个命令保存服务器套接字。意味着套接字一次接受命令。在该服务器不接受其他命令之后。例如。如果客户端发送“restart”,那么服务器将在给定的时间内执行命令,如果客户端发送“abort”命令,那么它应该被中止。但是服务器套接字在只接受一个命令后关闭。

如何让服务器套接字等待进一步的命令?

这是服务器代码:

 running = true;
    try {
        System.out.println("Waiting for client........");
        ServerSocket serverSocket = new ServerSocket(8002);
        Socket client = serverSocket.accept();
        System.out.println("Connection Accepted......");
        BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
        try {
            while (running) {
                String usercmnd = in.readLine();
                if (usercmnd != null) {
                    Runtime runtime = Runtime.getRuntime();
                    Process p = runtime.exec(usercmnd);
                    //serverSocket.setSoTimeout(30000);
                }
            }

        } catch (Exception e) {
            System.out.println("Error");
            e.printStackTrace();
        }finally{
        client.close();
        System.out.println("Connection Closed......");
        }
    } catch (Exception e) {
        System.out.println("Error");
        e.printStackTrace();
    } 

这是客户端代码

restart.setOnClickListener(
            new View.OnClickListener() {
                public String rest = "shutdown -r -t 30";
                @Override
                public void onClick(View v) {
                    Socket cs = null;
                    try{
                        cs = new Socket("192.168.20.128",8002);
                        DataOutputStream out = new DataOutputStream(cs.getOutputStream());
                        out.writeBytes(rest);
                        Toast.makeText(PowerActivity.this, "Restart Success", Toast.LENGTH_LONG).show();

                    }
                    catch (IOException e) {
                        Toast.makeText(PowerActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
                    }finally {
                        try {
                            cs.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
    );

【问题讨论】:

  • 将您的Socket client = serverSocket.accept(); 放入一个循环中以接受多个连接。
  • 你要求等待,我给了你。我想帮忙。请不要唠叨我的代表@nilesh kumar
  • 是的!它的工作..!!@f1sh

标签: java android sockets network-programming client-server


【解决方案1】:

但是如何为客户端的下一个命令保存服务器套接字。意味着 套接字正在接受一次命令。在那个服务器不是之后 接受其他命令。

这取决于您如何向服务器发送命令。

  1. 如果您在单击同一按钮时向服务器发送命令,那么我找不到从您的客户端发送到服务器的其他消息。然而,服务器正在等待循环中的数据。

  2. 如果您向服务器发送命令,每次单击按钮;那么在这种情况下,服务器只能接受一个连接,因为它只有一个 socket.accept() 方法。

如果您要以这种方式发送命令,请将您的服务器代码包装在 while(true) 循环中。

在这种情况下,您的服务器代码应该是这样的:

try {
    System.out.println("Waiting for client........");
    ServerSocket serverSocket = new ServerSocket(8002);
    while(true){
    Socket client = serverSocket.accept();
    System.out.println("Connection Accepted......");
    ...//
   }

在这种情况下,您必须使用线程来管理您的套接字输入流,因为in.readLine(); 是一个阻塞调用;你也有无限循环。因此,使用一个线程,将您的套接字对象(在您的服务器代码中称为client)传递给该线程,并将其余主体包装在线程的 run 方法中。


注意:顺便说一句,我怀疑您正在尝试按照您给出的命令关闭服务器。如果是这种情况,那么它将无法进一步通信,因为服务器将被关闭。

如果不是这样,那也没关系。可能,在那种情况下,我误解了你的问题的命令。

【讨论】:

  • 是的!它现在工作
猜你喜欢
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
  • 2017-02-25
  • 2012-06-24
  • 1970-01-01
  • 2021-11-08
相关资源
最近更新 更多