java多线程编写简易聊天程序

春晖 2012-12-01 04:30:04
public class ComServer {

private int port=7000;
//一个存放套接字的静态数组,将其作为一个静态域,使各个线程共享
private static LinkedList<Socket> consocket;
private static int socketnum=0;
private ServerSocket serversocket;
private ExecutorService threadpool; //线程池
private final int POOL_SIZE=4; //单个CPU时线程池中工作线程的个数

public ComServer() throws IOException{
serversocket=new ServerSocket(port); //服务器监听8000端口

//创建线程池
//根据系统CPU的数据来设置工作线程池的大小
//Executors接口提供一种将任务提交与每个任务如何执行的机制分离开来的方法
threadpool=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);

System.out.println("服务器已经启动");
}

public void service(){
Socket socket=null;
while(true){
try{

socket=serversocket.accept(); //将连接的套接字放入套接字数组当中
consocket.add(socket); //没法插入
threadpool.execute(new Handler(socket)); //把与客户端通信的任务交给线程池

}catch(Exception e){
e.printStackTrace(); //打印捕获的异常信息
}
}
}

public static void main(String[] args) {
try {
new ComServer().service();
} catch (IOException e) {
e.printStackTrace();
}
}

//实现一个静态类
private static 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(socketOut,true);
}

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

public void run(){
try{
System.out.println("New Connection accepted"+socket.getInetAddress()+":"+socket.getPort());
BufferedReader br=getReader(socket);


String msg=null;
int i=0;
Iterator<Socket> it= consocket.iterator(); //迭代
while((msg=br.readLine())!=null){
while(it.hasNext()){ //遍历所有的连接
PrintWriter pw=getWriter(it.next()); //发送给每一个socket进程
pw.println(msg);
}
}

}catch(Exception e){
System.out.println(Thread.currentThread().getName()+"已经退出");
}finally{
try{
if(socket!=null)
socket.close();
}catch(IOException ioe){
ioe.printStackTrace();
}
}
}
}

}
[code=java]
[/code]

//不知道什么原因,总是没法向数组中插入SOCKET
...全文
223 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
春晖 2012-12-01
  • 打赏
  • 举报
回复
求给个解释。。。

58,453

社区成员

发帖
与我相关
我的任务
社区描述
Java Eclipse
社区管理员
  • Eclipse
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧