【问题标题】:Chat client how to forbid username from being used a second time?聊天客户端如何禁止用户名被第二次使用?
【发布时间】:2012-11-20 04:24:33
【问题描述】:

输入用户名并按下连接按钮时:

public connect{...
sock = new Socket("77.70.65.222", 5000);
InputStreamReader streamreader = new InputStreamReader(sock.getInputStream());
reader = new BufferedReader(streamreader);
writer = new PrintWriter(sock.getOutputStream());
Thread IncomingReader = new Thread(new IncomingReader());
IncomingReader.start();
writer.println("``connecto"); 
//sends message to server, which sends back a message ,which when read by my 
//IncomingReader class(implements Runnable) prints online users in "onlineUsersArea"
writer.flush();
String[] a = onlineUsersArea.getText().split("\n");
for(String s:a){if(s.equals(username)) throw new Exception();}
//throws an exception if the selected username exists
writer.println(username + "`has connected.`Connect"); // Displays to everyone that user connected.
writer.flush(); // flushes the buffer
...}

问题是该方法没有等待IncomingReader 打印在线用户,因为a[] 在方法完成之前不包含任何内容。 我该怎么做才能让它等待IncomingReader 然后从writer.flush(); 继续 如果我添加一个IncomingReader.join();,在我按下连接按钮后,客户端停止响应。
如果我有其他方法可以阻止用户使用已经使用过的用户名,我将非常高兴听到它。 提前致谢!

【问题讨论】:

  • 如果你想让别人阅读你的代码,你真的应该格式化它。
  • 只需在start(); 之后添加IncomingReader.join();
  • 代码好像不完整,超级难读。

标签: java multithreading swing methods wait


【解决方案1】:

这只是一个尝试,但如果你在另一个线程上运行编写器呢? 我认为问题可能是主线程在等待另一个线程完成工作时被阻塞了。

(提示:如果我是你,我不会使用简单的 Exception-s。定义一个新的 Exception 类型并在需要时仅处理该类型。)

【讨论】:

  • 非常感谢!我将代码移到了 writer.flush();进入 IncomingReader 类,它似乎完全按照我的意愿工作。
猜你喜欢
  • 2019-08-16
  • 1970-01-01
  • 2022-10-18
  • 1970-01-01
  • 2015-10-12
  • 2011-01-04
  • 1970-01-01
  • 2015-03-09
  • 1970-01-01
相关资源
最近更新 更多