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 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥20 Python安装cvxpy库出问题
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥15 python天天向上类似问题,但没有清零
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题