【问题标题】:Java server-client | server wont receive second requestJava 服务器-客户端 |服务器不会收到第二个请求
【发布时间】:2010-12-21 12:32:04
【问题描述】:

我正在尝试为任务编写客户端和时间服务器,但无法让服务器接收来自客户端的第二个请求。第一个请求顺利通过。然后它就停止了。实际上,我对这整件事很迷茫,而且对 java 还是很不舒服,所以我不知道我错过了什么。非常感谢任何指针。谢谢!

这是服务器代码:

 import java.io.*;
 import java.util.*;
 import java.net.*;
 import java.text.*;

 public class myServer {

      protected static final int PORT_NUMBER = 55555;

      public static void main( String args[]) {

      try {

           ServerSocket servsock = new ServerSocket(PORT_NUMBER);

           System.out.println("Server running...");

           while(true) {

                Socket sock = servsock.accept();

                System.out.println("Connection from: " + sock.getInetAddress());

                Scanner in = new Scanner(sock.getInputStream());
                PrintWriter out = new PrintWriter(sock.getOutputStream());
                String request = "";

                request = in.next();

                System.out.println("Request: " + request);

                if(request.toUpperCase().equals("TIME")) {
                     out.println(getTime());
                     out.flush();
                } else {
                     out.println("Invalid Request...");
                     out.flush();
                }

            }

        } catch(Exception e) {
           System.out.println(e.toString());
        }

    }

      protected static String getTime() {
           DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
           Date date = new Date();
           return (dateFormat.format(date));
      }

}

这是客户:

 import java.io.*;
 import java.util.*;
 import java.net.*;

 public class myClient {

        protected static final String HOST = "127.0.0.1";
        protected static final int PORT = 55555;

        protected static Socket sock;

        public static void main(String args[]) {

        try {

              sock = new Socket(HOST,PORT);

              System.out.println("Connected to " + HOST + " on port " + PORT);

              Scanner response = new Scanner(sock.getInputStream());
              PrintWriter request = new PrintWriter(sock.getOutputStream());
              BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
              String txt = "";

              while(!txt.toUpperCase().equals("EXIT")) {

                    System.out.print("prompt:");
                    txt = in.readLine();

                    request.println(txt);
                    request.flush();

                    System.out.println(response.next());

              }

              request.close();
              response.close();
              in.close();
              sock.close();

           } catch(IOException e) {
              System.out.println(e.toString());
           }
      }

 }

【问题讨论】:

    标签: java sockets client-server java.util.scanner printwriter


    【解决方案1】:

    来自PrintWriterdocs

    ...如果启用了自动刷新,则仅当调用 printlnprintfformat 方法之一时才会完成...

    您的服务器正在调用print() 并且从不刷新流,因此永远不会发送时间。调用println() 或显式刷新流。

    另外,服务器发送时间后立即关闭连接,所以客户端的第二次请求总是失败...

    编辑:这里有一个有趣的怪癖 - 关闭 PrintWriter 应该 以刷新它(参见 Writer 的规范),但由于顺序似乎发生的操作是:

    1. in.close() 关闭底层 Socket
    2. out.close() 刷新写入的数据,但不能(因为套接字现在已关闭)

    不确定这到底是怎么回事,但是交换这两个语句的顺序会改变行为,大概是给out.close() 一个刷新的机会...

    【讨论】:

    • 谢谢,我改变了一些东西,终于让两者进行交流。但是,它仍然不接受第二个请求。我正在将问题中的代码更新为当前版本。有什么想法吗?
    • 在读取第一个请求后,服务器只是丢弃连接并再次调用servsock.accept(),导致它等待客户端连接。
    【解决方案2】:

    你需要有另一个while循环,像这样,

      while(true) {                
          Socket sock = servsock.accept();                
          System.out.println("Connection from: " + sock.getInetAddress());                
          Scanner in = new Scanner(sock.getInputStream());                
          PrintWriter out = new PrintWriter(sock.getOutputStream());                
          String request = "";                
          while (in.hasNext()) {
              request = in.next();                
              System.out.println("Request: " + request);                
              if(request.toUpperCase().equals("TIME")) {                     
                  out.println(getTime());
                  out.flush();                
              } else {
                   out.println("Invalid Request...");                     
                   out.flush();
              }
          }
     }
    

    【讨论】:

    • 非常感谢!我已经为这件事翻了这么久。我不知道为什么我没有看到它,但是谢谢!
    • 谢谢你拯救我的一天:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    相关资源
    最近更新 更多