【javascript学习指南】java利用Socket实现聊天室功能实例

更新时间:2021-06-15    来源:php基础    手机版     字体:

【www.bbyears.com--php基础】

最近研究了下Java socket通信基础,利用代码实现了一个简单的多人聊天室功能,现把代码共享下,希望能帮到有兴趣了解的人。

目录结构:

ChatClient:

 

 代码如下

packagecom.panda.chat;

  

importjava.awt.*;

importjava.awt.event.*;

importjava.io.*;

importjava.net.*;

  

@SuppressWarnings("serial")

publicclassChatClientextendsFrame {

 privateTextArea ta =newTextArea();

 privateTextField tf =newTextField();

 privateDataOutputStream dos =null;

 privateDataInputStream dis =null;

 privateSocket socket =null;

 privatebooleanbConnected =false;

 privateThread thread=null;

 publicstaticvoidmain(String[] args) {

  newChatClient().frameClient();

 }

 publicvoidframeClient(){

  setSize(400,400);

  setLocation(400,300);

  add(ta,BorderLayout.NORTH);

  add(tf,BorderLayout.SOUTH);

  pack();

  tf.addActionListener(newTfListener());

  //关闭窗口事件监听

  this.addWindowListener(newWindowAdapter() {

   @Override

   publicvoidwindowClosing(WindowEvent e) {

    disconnected();

    System.exit(0);

   }

  });

  this.connect();

  setVisible(true);

 }

 //链接服务器地址

 privatevoidconnect(){

  try{

   socket =newSocket("127.0.0.1",8888);

   thread=newThread(newChatThread());

   thread.start();

   dos =newDataOutputStream(socket.getOutputStream());

   dis =newDataInputStream(socket.getInputStream());

  }catch(UnknownHostException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }catch(IOException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

 }

 //断开连接

 privatevoiddisconnected(){

  bConnected =false;

  try{

   dos.close();

   dis.close();

   socket.close();

  }catch(IOException e1) {

   // TODO Auto-generated catch block

   e1.printStackTrace();

  }

 }

 //键盘回车事件

 privateclassTfListenerimplementsActionListener{

  

  @Override

  publicvoidactionPerformed(ActionEvent e) {

   String strMsg = tf.getText();

   tf.setText("");

   try{

    dos.writeUTF(strMsg);

    dos.flush();

   }catch(IOException e1) {

    // TODO Auto-generated catch block

    e1.printStackTrace();

   }

  }

    

 }

 //开启线程接受服务器信息

 privateclassChatThreadimplementsRunnable{

  @Override

  publicvoidrun() {

   try{

    bConnected =true;

    while(bConnected){

     String msg = dis.readUTF();

     String taText = ta.getText();

     ta.setText(taText+msg+"\n");

    }

   }catch(SocketException e) {

    System.out.println("退出");;

   }catch(IOException e) {

    e.printStackTrace();

   }

  }

 }

}

 

ChatServer:

 

 代码如下

packagecom.panda.chat;

  

importjava.io.*;

importjava.net.*;

importjava.util.*;

  

publicclassChatServer {

 privatebooleanstarted =false;

 privateListchatThreads =newArrayList();

 publicstaticvoidmain(String[] args) {

  newChatServer().startServer();

 }

 privatevoidstartServer(){

  try{

   //开启服务端Socket

   ServerSocket seso =newServerSocket(8888);

   started =true;

   while(started){

    //接受客户端连接请求

    Socket sos = seso.accept();

    System.out.println("一个客户端已连接");

    //开启线程处理客户端通信

    ChatThread ct =newChatThread(sos);

    chatThreads.add(ct);

    newThread(ct).start();

   }

  }catch(IOException e) {

   e.printStackTrace();

  }

 }

 privateclassChatThreadimplementsRunnable{

  privateSocket socket;

  privateDataInputStream din=null;

  privateDataOutputStream don=null;

  privatebooleanbConnected =false;

  publicChatThread(Socket socket) {

   super();

   this.socket = socket;

  }

  //发送信息的函数

  privatevoidsend(String strMsgIn){

   try{

    don.writeUTF(strMsgIn);

    don.flush();

   }catch(IOException e){

    e.printStackTrace();

   }

  }

  @Override

  publicvoidrun() {

   try{

    din =newDataInputStream(socket.getInputStream());

    don =newDataOutputStream(socket.getOutputStream());

    //读取数据

    bConnected =true;

    while(bConnected){

     String strMsgIn = din.readUTF();

     System.out.println(strMsgIn);

     //接收到数据后发送给每个客户端

     for(inti =0;i

      chatThreads.get(i).send(strMsgIn);

     }

    }

   }catch(IOException e) {

    try{

     //如果客户端出错或关闭,直接关闭连接,并移除List中的当前线程

     socket.close();

     chatThreads.remove(this);

    }catch(IOException e1) {

     // TODO Auto-generated catch block

     e1.printStackTrace();

    }

   }finally{

    try{

     din.close();

     don.close();

     socket.close();

    }catch(IOException e) {

     // TODO Auto-generated catch block

     e.printStackTrace();

    }

   }

  }

   

 }

}

 

运行ChatSever后,再同时打开多次ChatClient,就可以实现多人聊天了,你也试试。

本文来源:http://www.bbyears.com/jiaocheng/123826.html