首页 > 编程 > Java > 正文

java利用Socket实现聊天室功能实例

2019-11-26 13:07:48
字体:
来源:转载
供稿:网友

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

目录结构:

ChatClient:

package com.panda.chat;  import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*;  @SuppressWarnings("serial") public class ChatClient extends Frame {  private TextArea ta = new TextArea();  private TextField tf = new TextField();  private DataOutputStream dos = null;  private DataInputStream dis = null;  private Socket socket = null;  private boolean bConnected = false;  private Thread thread=null;  public static void main(String[] args) {   new ChatClient().frameClient();  }  public void frameClient(){   setSize(400, 400);   setLocation(400,300);   add(ta,BorderLayout.NORTH);   add(tf,BorderLayout.SOUTH);   pack();   tf.addActionListener(new TfListener());   //关闭窗口事件监听   this.addWindowListener(new WindowAdapter() {    @Override    public void windowClosing(WindowEvent e) {     disconnected();     System.exit(0);    }   });   this.connect();   setVisible(true);  }  //链接服务器地址  private void connect(){   try {    socket = new Socket("127.0.0.1", 8888);    thread=new Thread(new ChatThread());    thread.start();    dos = new DataOutputStream(socket.getOutputStream());    dis = new DataInputStream(socket.getInputStream());   } catch (UnknownHostException e) {    // TODO Auto-generated catch block    e.printStackTrace();   } catch (IOException e) {    // TODO Auto-generated catch block    e.printStackTrace();   }  }  //断开连接  private void disconnected(){   bConnected = false;   try {    dos.close();    dis.close();    socket.close();   } catch (IOException e1) {    // TODO Auto-generated catch block    e1.printStackTrace();   }  }  //键盘回车事件  private class TfListener implements ActionListener{    @Override   public void actionPerformed(ActionEvent e) {    String strMsg = tf.getText();    tf.setText("");    try {     dos.writeUTF(strMsg);     dos.flush();    } catch (IOException e1) {     // TODO Auto-generated catch block     e1.printStackTrace();    }   }     }  //开启线程接受服务器信息  private class ChatThread implements Runnable{   @Override   public void run() {    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:

package com.panda.chat;  import java.io.*; import java.net.*; import java.util.*;  public class ChatServer {  private boolean started = false;  private List<ChatThread> chatThreads = new ArrayList<ChatThread>();  public static void main(String[] args) {   new ChatServer().startServer();  }  private void startServer(){   try {    //开启服务端Socket    ServerSocket seso = new ServerSocket(8888);    started = true;    while(started){     //接受客户端连接请求     Socket sos = seso.accept();     System.out.println("一个客户端已连接");     //开启线程处理客户端通信     ChatThread ct = new ChatThread(sos);     chatThreads.add(ct);     new Thread(ct).start();    }   } catch (IOException e) {    e.printStackTrace();   }  }  private class ChatThread implements Runnable{   private Socket socket;   private DataInputStream din=null;   private DataOutputStream don=null;   private boolean bConnected = false;   public ChatThread(Socket socket) {    super();    this.socket = socket;   }   //发送信息的函数   private void send(String strMsgIn){    try{     don.writeUTF(strMsgIn);     don.flush();    }catch(IOException e){     e.printStackTrace();    }   }   @Override   public void run() {    try{     din = new DataInputStream(socket.getInputStream());     don = new DataOutputStream(socket.getOutputStream());     //读取数据     bConnected = true;     while(bConnected){      String strMsgIn = din.readUTF();      System.out.println(strMsgIn);      //接收到数据后发送给每个客户端      for(int i =0;i<chatThreads.size();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,就可以实现多人聊天了,你也试试。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表