软件编程
位置:首页>> 软件编程>> java编程>> java利用Socket实现聊天室功能实例

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

作者:Eric_ley  发布时间:2022-11-10 01:25:43 

标签:java,socket,聊天室

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

目录结构:

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,就可以实现多人聊天了,你也试试。

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

来源:http://blog.csdn.net/eric_ley/article/details/54906931

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com