CalvinSin 2017-11-28 10:44 采纳率: 0%
浏览 964

关于iterator的成员遍历问题

我写了服务器端和客户端的程序,我想是实现客户之间发送群组消息,所以我在服务器端定义全局变量在线组员集合,然后在服务器主类构造方法实例化了在线组员集合,然后定义一个群组消息发送方法,但是发现遍历不成功,跳出了while语句,it.hasNext()竟然为false

客户端的代码应该是没问题的,就是 使用使用线程去接收服务器端的消息

新人一枚 求求大神指教一下

代码如下

public class GroupServer {
private static Set Members;

private int port=8008;

private ServerSocket serverSocket;
private ExecutorService executorService; //线程池
private final int POOL_SIZE=15; //单个CPU时线程池中工作线程的数目

public GroupServer() throws IOException {

serverSocket = new ServerSocket(port);//打开服务器端口

//创建线程池
//Runtime的availableProcessors()方法返回当前系统的CPU的数目
//系统的CPU越多,线程池中工作线程的数目也应该越多
executorService= Executors.newFixedThreadPool(
     Runtime.getRuntime().availableProcessors() * POOL_SIZE);

Members=new HashSet ();
System.out.println("多用户服务器启动");
}

public void service() {

 while (true) {
  Socket socket=null;
  try {
    socket = serverSocket.accept(); //监听客户请求, 阻塞语句.
    //接受一个客户请求,从线程池中拿出一个线程专门处理该客户.
    executorService.execute(new Handler(socket));
  }catch (IOException e) {  }
}

}

public static void sendToAllMembers(String msg)throws IOException{

PrintWriter pw;
Socket tempSocket;
OutputStream out;

Iterator it=Members.iterator();
while(it.hasNext()){//遍历在线成员set集合.
System.out.println("socketTCP.GroupServer.sendToAllMembers()");
tempSocket=(Socket) it.next(); //取出一个成员
out =tempSocket.getOutputStream();//得到输出流
//装饰成字符流
pw=new PrintWriter(new OutputStreamWriter(out,"GB2312"),true);
System.out.println("socketTCP.GroupServer.sendToAllMembers()");
pw.println(msg);//发送聊天信息给成员
}//end while群组发送结束。
}
public static void removeMember(Socket socket){
Members.remove(socket);//删除一个成员
}
class Handler implements Runnable{
private Socket socket;

public Handler(Socket socket){
this.socket=socket;
}
private PrintWriter getWriter(Socket socket)throws IOException{
OutputStream socketOut = socket.getOutputStream();
return new PrintWriter(new OutputStreamWriter(socketOut,"GB2312"),true);
}

private BufferedReader getReader(Socket socket)throws IOException{
InputStream socketIn = socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn,"GB2312"));
}

public void run(){//覆盖线程体
try {
System.out.println("New connection accepted " +socket.getInetAddress());

  BufferedReader br =getReader(socket);//字节装饰成字符流
  PrintWriter pw = getWriter(socket); //字节装饰成字符流

  String msg = null;
  while ((msg = br.readLine()) != null) {        
        sendToAllMembers(msg);

      pw.println("From ThreadServer: "+msg);//send to client.

    if (msg.contains("bye".subSequence(0, 2))){
     System.out.println( socket.getInetAddress() + ":" +"Exit");
        break;
    }
  }
}catch (IOException e) {
   e.printStackTrace();
}finally {
   try{
     if(socket!=null)socket.close();
   }catch (IOException e) { }
}

}
}

public static void main(String args[])throws IOException {
new GroupServer().service();
}

}

  • 写回答

1条回答 默认 最新

  • CalvinSin 2017-12-01 04:46
    关注

    有没有大神知道为什么,,,小弟真的找不出哪里出错

    评论

报告相同问题?

悬赏问题

  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?