【发布时间】:2014-12-04 19:12:51
【问题描述】:
我正在为计算机科学课程制作客户端/服务器程序。
我们的想法是我们有一个服务器程序,它接受控制台命令列表,执行它们,并通过输入/输出流返回响应。由于命令的格式,我必须检查空格和数字并相应地拆分字符串(我已经完成了)。问题似乎在于从 InputStream 中检索命令。
应该接受的命令:
输入 [字符串] [整数] - 这应该在 HashMap 中存储一个字符串(键)和整数(值)
得到[字符串] - 这应该返回与此字符串关联的 int
键集 - 返回所有键
价值观 - 返回所有值
映射 - 返回所有映射
再见 - 退出客户端
帮助 - 还没有做任何事情,但会列出所有命令及其语法
教授为我们提供了服务器的大部分代码,但我认为其中可能存在错误,因为我不断收到 Scanner 上的异常。请参阅下面的服务器代码:
package mapserver;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class MapServer
{
public static void main(String[] args) throws IOException
{
ServerSocket serverSocket = new ServerSocket(50000);
while (true)
{
Socket activeSock = serverSocket.accept();
Thread th = new Thread(new MapServerThread(activeSock));
th.start();
}
}
}
class MapServerThread implements Runnable
{
private Map<String, Integer> map = new HashMap<>();
private Socket sock;
public MapServerThread(Socket s)
{
sock = s;
List<String> strs = Arrays.asList("aaa a", "b", "a");
for (String str : strs)
{
map.put(str, str.length());
}
}
@Override
public void run()
{
try
{
InputStream in = sock.getInputStream();
OutputStream out = sock.getOutputStream();
BufferedReader reader =
new BufferedReader(new InputStreamReader(in));
PrintWriter writer = new PrintWriter(out, true);
// welcome message
writer.println("Welcome to the map service.");
String inputLine = null;
while ((inputLine = reader.readLine()) != null)
{
Scanner sc = new Scanner(inputLine);
String fullLine =
sc.nextLine().toLowerCase().trim().replaceAll("\\s+", " ");
writer.println(fullLine);
int cmdLoc = 0;
for (int k = 0; k <fullLine.length(); k++)
{
if (fullLine.charAt(k)==' ');
{
cmdLoc = k;
}
}
String cmd;
if (cmdLoc == 0)
{
cmd = fullLine;
writer.println(cmd);
}
else
{
cmd = fullLine.substring(0, cmdLoc+1);
writer.println(cmd);
}
int startloc = cmd.length() + 1;
switch(cmd)
{
case "put":
int intlocation = startloc;
for (int k = 0; k < fullLine.length(); k++)
{
if (Character.isDigit(fullLine.charAt(k)))
{
intlocation = k;
}
}
// if the int is located at the beginning, the format
// is wrong. Let the user know
if (intlocation == startloc)
{
writer.println("Invalid entry. Correct format "
+ "is \"put <string> <integer>\"");
}
// Split the user's entry for putting
else
{
String stringToPut =
fullLine.substring(startloc, intlocation+1);
int intToPut =
Integer.parseInt(fullLine.substring(intlocation));
map.put(stringToPut, intToPut);
writer.println("Ok!");
}
continue;
case "get":
int returnvalue =
map.get(fullLine.substring(startloc));
writer.println(returnvalue);
continue;
case "keyset":
String result = map.keySet().toString();
writer.println(result);
continue;
case "values" :
String result1 = map.values().toString();
writer.println(result1);
continue;
case "mappings" :
writer.println(map.size());
map.forEach(
(k, v) ->
{ writer.println( k + " " + v);}
);
continue;
case "bye" :
writer.println("See you later.");
sock.shutdownOutput();
sock.close();
return;
case "help" :
continue;
default :
writer.println("Not a recognized command");
}
}
} catch (IOException ex)
{
throw new RuntimeException(ex);
}
}
}
我几乎 100% 确定问题出在服务器程序中,因为我一直在使用 Telnet 对其进行测试。我尝试直接使用 BufferedReader 而不是扫描仪,但服务器似乎正在获取空白字符串。有没有人有任何想法?我已经摆弄了几个小时了,我就是想不通。
问题简述:
我登录后,服务器抛出:
Exception in thread "Thread-0" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1540)
at mapserver.MapServerThread.run(MapServer.java:67)
at java.lang.Thread.run(Thread.java:745)
我不知道为什么。如果我不使用扫描仪,由于某种原因,无论我输入什么,服务器都会收到空白输入。
正确的交互应该是这样的:
Welcome to the MapService Client
Enter the IP address of the server: localhost
Please wait while I connect you...
Welcome to the map service.
Map service>mappings
3
a 1
b 1
aaa a 5
Map service>put North Central College 2014
Ok.
Map service>keyset
[a, b, aaa a, North Central College]
Map service>get North Central College
2014
Map service>help
7
help
get key
put key value
values
keyset
mappings
bye
Map service>values
[1, 1, 5, 2014]
Map service>bye
See you later.
【问题讨论】:
-
你实际上并没有告诉我们问题是什么
-
我对其进行了编辑以添加更多内容
-
我修复了子字符串错误。感谢您指出了这一点。在第一个命令之后我仍然遇到异常。
-
请准确概述,应该写什么到外流。
-
添加了从客户的角度来看应该是什么样子
标签: java inputstream java.util.scanner