【问题标题】:Simple Client-Server Communication?简单的客户端-服务器通信?
【发布时间】:2014-04-16 12:27:35
【问题描述】:

在 Java 中的服务器套接字实验室工作,我们的讲师为我们提供了代码的客户端。在项目中,客户端向服务器发送一个字符串。服务器然后转身将字符串发送回客户端。

客户

        Socket server = new Socket(host, 30000); 

        // Sends the string to the Server
        Socket server = new Socket(host, 30000);
        OutputStream serverOut = server.getOutputStream();
        PrintWriter serverWrite = new PrintWriter(serverOut, true);
        serverWrite.println("Bryce");


        //Manages Server's response of "Hello, Bryce!"
        InputStream serverIn = server.getInputStream();
        Scanner serverScan = new Scanner(serverIn);
        serverScan.useDelimiter("$");
        String resp = serverScan.next();

服务器

    ServerSocket ss = new ServerSocket(30000);
    Socket s = ss.accept();
    InputStream is = s.getInputStream();


     // Gets Message from Client
    InputStreamReader reader = new InputStreamReader(is);
    BufferedReader readerBuff = new BufferedReader(reader);
    String stringFromClient = readerBuff.readLine();


     // Sends Message back to Client
     OutputStream oos = s.getOutputStream();
     PrintWriter pl = new PrintWriter(oos, true);
     pl.println("Hello, " + stringFromClient + "!");

每次我运行程序时,它都会弹出一个 NoSuchElementException 并引用客户端中的违规行:

String resp = serverScan.next();

这应该是一个相当简单的问题(我以前完成过这类问题)。如果我替换

 String resp = serverScan.next();

 String resp = serverScan.toString();

它工作正常,但由于我不允许修改客户端代码,我完全糊涂了。我在这里错过了什么吗?

【问题讨论】:

  • serverScan.next() 从客户端获取下一行。 serverScan.toString() 获取 Scanner 对象的文本表示(可能类似于 java.util.Scanner@0xF35AB395

标签: java sockets


【解决方案1】:

在客户端代码中,你有

serverScan.useDelimiter("$");

这意味着客户端扫描器将使用$ 作为传入字符的分隔符。所以为了让客户端知道发送了一个完整的tokenized字符串,需要在服务器发送的消息字符串的末尾再添加一个字符:

pl.println("Hello, " + stringFromClient + "!" + "$");

Scanner 类中next 方法的javadoc 说:

从这个扫描器中查找并返回下一个完整的令牌。一个 完整的令牌之前和之后是匹配的输入 分隔符模式。

【讨论】:

  • 我最终在我的服务器代码末尾添加了 oos.flush 和 oos.close 并修复了它。
  • @user2453973 close() 意味着 flush()。你不需要flush()。
猜你喜欢
  • 2012-09-27
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 2011-07-27
  • 2012-12-26
  • 2011-09-05
  • 2012-03-01
相关资源
最近更新 更多