使用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();
它工作正常,但由于我不允许修改客户端代码,我完全感到困惑。我在这里错过了什么吗?
答案 0 :(得分:0)
在客户端代码中,您有
serverScan.useDelimiter("$");
这意味着客户端扫描程序将使用$
作为传入字符的分隔符。因此,为了让客户端知道发送完整的标记化字符串,您需要在服务器发送的消息字符串末尾再添加一个字符:
pl.println("Hello, " + stringFromClient + "!" + "$");
Scanner
课程中next
方法的javadoc说:
查找并返回此扫描仪的下一个完整令牌。一个 完整标记之前和之后是匹配的输入 分隔符模式。