我(试图)提出一个小小的聊天提示,但它目前并没有按计划进行。
new Thread(new Runnable(){
@Override
public void run(){
while (true){
for (Socket s : s){
for (String str : receive(s)){
System.out.println("processing "+str);
if (str.startsWith("#reg")){
str = str.replaceAll("#reg", "");
registered.put(s.getInetAddress().toString(), str);
System.out.println("SERVER >> user "+str+" on "+s.getLocalAddress().toString()+" registered!");
send(s, "#confirmed");
}else{
sendToAll(registered.get(s.getLocalAddress().toString())+" >> "+str);
}
}
}
}
}
}).start();
就在这里我正在检查所有收到的消息。他们收到了这种方法。
public List<String> receive(Socket s){
try{
List<String> lines = new ArrayList<String>();
InputStream is = s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = br.readLine()) != null) {
lines.add(line);
System.out.println("SRECEIVE >> "+line);
}
return lines;
}catch(Exception e){
e.printStackTrace();
}
return null;
}
正在运行,控制台中会弹出一条带有“SRECEIVE&gt;&gt; msg”的消息。
但是线程(第一个代码)中的行System.out.println("processing "+str);
没有弹出。
变量“s”是(连接)套接字的数组。
“接收(Socket s)”被调用的唯一时间是在那个线程^^。
答案 0 :(得分:1)
因为此代码将继续运行
while ((line = br.readLine()) != null) {
lines.add(line);
System.out.println("SRECEIVE >> "+line);
}
直到溪流关闭。
您需要在单独的线程中执行此操作。