简单的客户端 - 服务器通信

时间:2014-04-16 01:10:12

标签: java sockets

使用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 + "!");

EverytimeI运行程序时,它会引发NoSuchElementException并引用Client中的违规行:

String resp = serverScan.next();

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

 String resp = serverScan.next();

 String resp = serverScan.toString();

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

1 个答案:

答案 0 :(得分:0)

在客户端代码中,您有

serverScan.useDelimiter("$");

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

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

Scanner课程中next方法的javadoc说:

  

查找并返回此扫描仪的下一个完整令牌。一个   完整标记之前和之后是匹配的输入   分隔符模式。