培训老师给我们做的一个聊天小程序,大家看看好不?
学校老师组织培训,我们的培训老师当时给我们做了一个小的聊天室的程序是用的命令行,10几分钟就做出来了,而且还一边打一边给我们讲解,感觉老师好厉害,大家给点建议,赫赫……
import java.util.*;import java.net.*;import java.io.*;public class Server{ public static final int port=10000; public static final Vector users=new Vector(); public static void main(String args[]){ ServerSocket server=null; try{ server=new ServerSocket(port); System.out.println("Server start up on port :"+port); while(true){ Socket s=server.accept(); User user=new User(s); user.start(); } }catch(Exception e){ e.printStackTrace(); }finally{ if(server!=null&&!server.isClosed()){ try{server.close();}catch(Exception e){} } } }}class User extends Thread{ private Socket s; private String userName; private InetAddress ip; public User(Socket s){ this.s=s; } public void run(){ try{ InputStream input=s.getInputStream(); OutputStream output=s.getOutputStream(); BufferedReader buf=new BufferedReader(new InputStreamReader(input)); PrintWriter pw=new PrintWriter(new OutputStreamWriter(output),true); pw.println("welcome u ,enter your name :"); userName=buf.readLine(); Server.users.add(this); sendAll(userName+" has join us ");; long t=0; while(true){ String line=buf.readLine(); long s=System.currentTimeMillis(); if((s-t)/1000<3){ pw.println("flush denied "); continue; } t=s; if(line==null||line.trim().length()==0){ pw.println("flush denied "); continue; } if(line.equals("bye")){ sendAll(userName+" leave us "); Server.users.remove(this); break; } sendAll(userName+" said :"+line); } }catch(Exception e){ //e.printStackTrace(); }finally{ if(s!=null)try{s.close();}catch(Exception e){} } } public synchronized void sendMessage(String message){ try{ PrintWriter pw=new PrintWriter(new OutputStreamWriter( s.getOutputStream())); pw.println(message); pw.flush(); }catch(Exception e){} } public void sendAll(String message){ Iterator it=Server.users.iterator(); while(it.hasNext()){ User user=(User)it.next(); user.sendMessage(message); } }}
package test.net;import java.util.*;import java.net.*;import java.io.*;public class Server{ public static final int port=10000; public static final Vector<User> users=new Vector<User>(); public static void main(String args[]){ ServerSocket server=null; try{ server=new ServerSocket(port); System.out.println("Server start up on port :"+port); while(true){ Socket s=server.accept(); User user=new User(new BufferedReader(new InputStreamReader(s.getInputStream())), new PrintWriter(s.getOutputStream(),true) ); user.start(); } }catch(Exception e){ e.printStackTrace(); }finally{ if(server!=null&&!server.isClosed()){ try{server.close();}catch(Exception e){} } } }}class User extends Thread{ private BufferedReader reader; private PrintWriter writer; private String userName; public User(BufferedReader reader, PrintWriter writer){ this.reader = reader; this.writer = writer; } public void run(){ try{ writer.println("welcome u ,enter your name :"); userName=reader.readLine(); Server.users.add(this); sendAll(userName+" has join us "); while(true){ String line=reader.readLine(); if(line==null||line.trim().length()==0){ writer.println("flush denied "); continue; } else if(line.equals("bye")){ sendAll(userName+" leave us "); Server.users.remove(this); break; } else{ sendAll(userName+" said :"+line); } } }catch(Exception e){ }finally{ try { reader.close(); } catch (IOException e) { } writer.close(); } } public synchronized void sendMessage(String message){ try{ writer.println(message); writer.flush(); }catch(Exception e){} } public void sendAll(String message){ Iterator it=Server.users.iterator(); while(it.hasNext()){ User user=(User)it.next(); user.sendMessage(message); } }}
[解决办法]
public class ConcurrentModificationExceptionextends RuntimeException当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
例如,某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection。通常在这些情况下,迭代的结果是不明确的。如果检测到这种行为,一些迭代器实现(包括 JRE 提供的所有通用 collection 实现)可能选择抛出此异常。执行该操作的迭代器称为快速失败 迭代器,因为迭代器很快就完全失败,而不会冒着在将来某个时间任意发生不确定行为的风险。
注意,此异常不会始终指出对象已经由不同 线程并发修改。如果单线程发出违反对象协定的方法调用序列,则该对象可能抛出此异常。例如,如果线程使用快速失败迭代器在 collection 上迭代时直接修改该 collection,则迭代器将抛出此异常。
注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败操作会尽最大努力抛出 ConcurrentModificationException。
[解决办法]
问题的核心:如何处理并发
[解决办法]