loading ...
搜狐圈子 IT数码 Java联盟 浏览帖子

来自圈子:Java联盟 (496 人)

圈子描述:Java程序设计交流区
圈子标签:Java web 程序设计 j2EE jsp
Java联盟
圈主:jake
副圈主:
共0页 | 上一页   1   下一页

用java对先程写的聊天室(服务端) 0/?

标签: java编程

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

public class Myserver extends Frame implements Runnable{
 Panel panel;
 ScrollPane sPanel;
 TextArea textArea;
 Button button1;
 
 ServerSocket serverSock;//建立一个服务器的套接字
 public final static int DEFAULT_PORT=5000;//默认端口号
 Thread chatAcceptThread;//启动接受连接的线程
 BroadcastThread broadcastThread;//广播thread; run when server is listening
 java.util.Vector clients;//记录连接的线程
 java.util.Vector clientsInfor;//记录连接线程的信息
 public static int index=0;
 
 public Myserver(){
  serverListen();//调用serverListen()方法对服务器进行监听
  }
 
 //监听端口 
 private void serverListen(){
  try{
   serverSock=new ServerSocket(DEFAULT_PORT);
  }catch(IOException e){
   System.out.println(e.toString());
   System.out.println("server failed!\n");
  }
  System.out.println("server listening on port:"+DEFAULT_PORT);
  clients=new java.util.Vector();
  clientsInfor=new java.util.Vector();
 
  chatAcceptThread=new Thread(this);//启动接受连接的线程
  chatAcceptThread.start();
 
  broadcastThread=new BroadcastThread(this);//广播线程
  broadcastThread.start();
 
  //还有一个回收无用连接thread 的线程
 }
 
 //线程的RUN方法
 public void run(){ //接受连接并记录线程信息
 int i=0;
 InetAddress host=null;
 
  try{
   while(true){
    Socket clientSock=serverSock.accept();
    host=InetAddress.getLocalHost();
    CommunicateThread ct=new CommunicateThread(clientSock,this,index);//创建线程保持连接
    clients.add(ct);//record Communicate Thread;
   
    i++;
    index++;//version2
    clientsInfor.add(host+"");
    System.out.println("thread"+i+"join in");
 
   
   }
  }catch(IOException e){
   System.out.println(e.toString());
  }
 }
 public static void main(String[] args){
  Myserver chat=new Myserver();
 }
 }
 
 class CommunicateThread extends Thread{//保持连接线程
 protected Socket clientSock;
 protected BufferedReader in=null;
 protected PrintWriter out;
 Myserver chatFrame;
 boolean isTrue=true;//run()
 java.util.Vector inforStack;
 int index2;
 //
 public CommunicateThread(Socket Sock,Myserver cFrame,int index){
  clientSock=Sock;
  chatFrame=cFrame;
  index2=index;
  inforStack=new java.util.Vector();
  try{
   in=new BufferedReader(new InputStreamReader(clientSock.getInputStream()));
   out=new PrintWriter(clientSock.getOutputStream());
  }catch(IOException ei){
   try{
    clientSock.close();
   }catch(IOException ei2){ }
   System.out.println(ei.toString());
   return;
  }
  this.start();
 }
 public void run(){
  String infor;
  try{
   while(isTrue){
    infor=in.readLine();
    if(infor.equals("Client exit!")){
     writeInformation(infor);//把信息写到信息栈,以倍广播出去
     stopRun();
    }else if(infor!=null){
     writeInformation(infor);
    }//else break;
    try{
     Thread.sleep(100);//version2
    }catch(InterruptedException ex){}
   }
  }catch(IOException e){ ;}
  finally{
   try{
    in.close();
    out.close();
    clientSock.close();
    chatFrame.clients.remove(index2);//在clients中清除本线程序
    Myserver.index--;//
   }catch(IOException ei){;}
  }
 
 }
 
 public void writeInformation(String infor){//写信息栈
  inforStack.add(infor);
 }
 
 private void stopRun(){//终止线程
  isTrue=false;
 }
 
 public void sendInformation(String str){//发送信息
  try{
   out.println(str);
   out.flush();
  }catch(Exception e){;}
 } 
 }
 
 class BroadcastThread extends Thread{//广播线程
 Myserver chatFrame2;
 java.util.Vector chatClients;//连接线程信息
 java.util.Vector msgStack;//信息栈
 java.util.Vector clientMsg;//记录客户发送的信息
 CommunicateThread comThread1;
 CommunicateThread comThread2;
 String string;//information in inforStack
 String clientName;//client thread name
 String broadcastInfor;//broadcast information=clientName+string;
 
 public BroadcastThread(Myserver cFrame){
  chatFrame2=cFrame;
  chatClients=chatFrame2.clients;
  clientMsg=chatFrame2.clientsInfor;
  //this.start();
 }
 
 public void broadcast(String str){//广播 
  for(int k=0;k<chatClients.size();k++){//send to everyone分别调用每个连接线程,发送信息
   comThread2=(CommunicateThread)chatClients.get(k);
   comThread2.sendInformation(str);
  }
 }
 
 public void run(){
  try{
   while(true){
    for(int i=0;i<chatClients.size();i++){
     comThread1=(CommunicateThread)chatClients.get(i);
     msgStack=comThread1.inforStack;//得到每个连接的信息栈
     clientName=(String)clientMsg.get(i);//客户名
     //读取每个连接线程的信息栈并把信息发送出去
     for(int j=0;j<msgStack.size();j++){
      string=(String)msgStack.get(j);
      broadcastInfor=clientName+"->"+string;
      broadcast(broadcastInfor);
     }
     //clear the inforStack
     msgStack.removeAllElements();//清除以发送的信息
    
    }
    try{
     Thread.sleep(100);//version2
    }catch(InterruptedException ex){}
   }
  }catch(Exception e){}
 }
 }
 
 
 

多分享,做达人>> 分享 分享 | 引用 | 回复 | 发表时间:2008-06-22
共0页 | 上一页   1   下一页