Chinaunix首页 | 论坛 | 博客
  • 博客访问: 194785
  • 博文数量: 76
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 490
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-12 16:58
文章分类

全部博文(76)

文章存档

2011年(3)

2010年(52)

2009年(21)

我的朋友

分类:

2010-03-01 19:10:18

(四)一个简单的聊天室

目的:做一个简单的聊天室,用来实现消息广播。


服务端代码:Server5.java

  1. import java.net.*;
  2. import java.io.*;
  3. import java.util.*;
  4. public class Server5 {
  5.         private ServerSocket server;
  6.         private BManager bMan=new BManager();//消息广播者
  7.         public Server5(){}  //构造函数
  8.         void startServer()  //启动服务器
  9.         {
  10.                 try{
  11.                         server=new ServerSocket(8888); //创建服务器套接字
  12.                         System.out.println("服务器套接字建立完毕");
  13.                         while(true)
  14.                         {
  15.                                 Socket socket=server.accept();//若客户机提请求,socket连接
  16.                                 new Chat_Thread(socket).start();//启动线程
  17.                                 bMan.add(socket);//添加套接字
  18.                                 bMan.sendClientInfo();//使用套接字输出当前聊天人数
  19.                         }
  20.                 }catch(Exception e){
  21.                         System.out.println(e);
  22.                 }
  23.         }
  24.         public static void main(String[] args) {
  25.                 Server5 server=new Server5();
  26.                 server.startServer();
  27.         }
  28.         class Chat_Thread extends Thread  //与客户机进行通信的线程累
  29.         {
  30.                 Socket socket; //套接字引用变量
  31.                 private BufferedReader reader;//引用套接字输入流;
  32.                 private PrintWriter writer;//引用套接字输出流;
  33.                 Chat_Thread(Socket socket)//构造函数
  34.                 {
  35.                         this.socket=socket;
  36.                 }
  37.                 public void run()
  38.                 {
  39.                         
  40.                         try
  41.                         {
  42.                                 reader=new BufferedReader(new InputStreamReader(socket.getInputStream(),"utf8"));
  43.                                 writer=new PrintWriter(socket.getOutputStream(),true);
  44.                                 String msg;
  45.                                 //从输出流获取信息
  46.                                 while((msg=reader.readLine())!=null)
  47.                                 {
  48.                                         System.out.println(msg);
  49.                                         //向所有客户机传送信息
  50.                                         bMan.sendToAll(msg);
  51.                                 }
  52.                         }catch(Exception e)
  53.                         {
  54.                                 
  55.                         }finally
  56.                         {
  57.                                 try {//从消息广播者立标中删除socket
  58.                                         bMan.remove(socket);
  59.                                         if(reader !=null) reader.close();
  60.                                         if(writer !=null) writer.close();
  61.                                         if(socket !=null) socket.close();
  62.                                         reader=null;
  63.                                         writer=null;
  64.                                         socket=null;
  65.                                         System.out.println("客户机离开");
  66.                                         //向所有客户机传送当前连接数
  67.                                         bMan.sendClientInfo();
  68.                                 } catch (Exception e) {}
  69.                         }
  70.                         
  71.                 }
  72.         }
  73. }
  74. //消息广播者类,继承Vector类
  75. class BManager extends Vector
  76. {
  77.         BManager (){}//构造函数
  78.         void add(Socket sock)
  79.         {
  80.                 super.add(sock);//添加套接字
  81.         }
  82.         void remove(Socket sock)
  83.         {
  84.                 super.remove(sock);//删除套接字
  85.         }
  86.    //向所有客户机传送消息,同步化方法。
  87.         synchronized void sendToAll(String msg)
  88.         {
  89.                 PrintWriter writer=null; //输出流
  90.                 Socket sock;  //套接字
  91.                 for(int i=0;i                {
  92.                         sock=(Socket)elementAt(i);//获取第i个套接字
  93.                         try
  94.                         {        //获取第i个套接字输出流
  95.                                 writer=new PrintWriter(sock.getOutputStream(),true);
  96.                         }catch(Exception ie){}
  97. //使用第i各套接字输出流,输出消息
  98.                         if(writer!=null) writer.println(msg);
  99.                 }
  100.         }
  101.         //向所有客户机发送当前聊天人数
  102.         synchronized void sendClientInfo()
  103.         {
  104.                 String info="当前聊天人数:"+size();
  105.                 System.out.println(info);
  106.                 sendToAll(info);
  107.         }
  108. }
复制代码

知识点:

消息广播者类名为Bmanager,他继承了Vector类

 

class Bmanager extends Vector

 

{

 

        Bmanager(){}

 

void add(Socket socket)

 

{

 

        //添加套接字

 

}

 

void remove(Socket socket)

 

{

 

        //删除套接字

 

}

 

synchronized void sendToAll(String msg)

 

{‘

 

        //使用套接字的输出流,输出消息

 

}

 

synchronized void sendClientInfo()

 

{

 

        //使用套接字的输出流,输出当前聊天人数

 

}

 

}



客户端代码:Client5.mxml

  1.                         import flash.net.Socket; //导入类包
  2.                 import flash.utils.ByteArray;//ByteArray在读取数据时使用
  3.                 private var socket:Socket=new Socket();//定义socket
  4.                 internal function initApp():void
  5.                 {
  6.                         socket.connect("127.0.0.1",8888);//执行连接
  7.                         //监听连接成功事件
  8.                         socket.addEventListener(Event.CONNECT,funConnect);
  9.                         //监听关闭事件
  10.                         socket.addEventListener(Event.CLOSE,funClose);
  11.                         //监听服务器新信息
  12.                         socket.addEventListener(ProgressEvent.SOCKET_DATA,funSocket);
  13.                 }
  14.                 internal function funConnect(event:Event):void
  15.                 {
  16.                         myText.text+="连接已建立 ";
  17.                 }
  18.                 internal function funClose(event:Event):void
  19.                 {
  20.                         myText.text+="连接已关闭 ";
  21.                 }
  22.                 internal function sendMessage(msg:String):void //发送数据到服务器
  23.                 {
  24.                         //新建一个ByteArray来存放数据
  25.                         var message:ByteArray=new ByteArray();
  26.                         //写入数据,使用writeUTFBytes以utf8格式传数据,避免中文乱码
  27.                         message.writeUTFBytes(msg+" ");
  28.                         //写入socket的缓冲区
  29.                         socket.writeBytes(message);
  30. //调用flush方法发送信息
  31.                         socket.flush();
  32.                         //清空消息框
  33.                         myInput.text="";
  34.                 }
  35.                 //接受服务器信息
  36.                 internal function funSocket(event:ProgressEvent):void
  37.                 {
  38.                         var msg:String="";
  39.                 //循环读取数据,socket的bytesAvailable对象存放了服务器传来的所有数据
  40.                         while(socket.bytesAvailable)
  41.                         {
  42.                                 //强制使用utf8格式,避免中文乱码
  43.                                 msg+=socket.readMultiByte(socket.bytesAvailable,"utf8");
  44.                                 //使用换行符号把信息切开
  45.                                 var arr:Array=msg.split(' ');
  46.                                 for(var i:int=0;i                                {
  47.                                         if(arr[i].length>1)
  48.                                         {
  49.                                                 //正则表达式,回车符
  50.                                                 var myPattern:RegExp=/ /;
  51.                                                 //删除回车符
  52.                                                 arr[i]=arr[i].replace(myPattern,'');
  53.                                                 //在聊天框中输出
  54.                                                 myText.text+=arr[i]+" ";
  55.                                         }
  56.                                 }
  57.                                 myText.verticalScrollPosition = myText.maxVerticalScrollPosition;//滚动到最下面
  58.                         }
  59.                                 
  60.                 }
  61.         ]]>
  62.         
  63.         
  64.         
  65.         
  66.         
阅读(622) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~