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

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

ChatClient:

public class ClientFrame extends Frame {

 

 private TextField textFieldContent = new TextField();

 private TextArea textAreaContent = new TextArea();

 private Socket socket = null;

 private OutputStream out = null;

 private DataOutputStream dos = null;

 private InputStream in = null;

 private DataInputStream dis = null;

 private boolean flag = false;

 

 /**

  * 启动客户端程序

  *

  * @param args

  */

 public static void main(String[] args) {

  new ClientFrame().init();

 }

 

 /**

  *  功能:对窗口进行初始化

  */

 private void init() {

  this.setSize(300, 300);

  setLocation(250, 150);

  setVisible(true);

  setTitle("WeChatRoom");

 

  // 添加控件

  this.add(textAreaContent);

  this.add(textFieldContent, BorderLayout.SOUTH);

  textAreaContent.setFocusable(false);

  pack();

 

  // 关闭事件

  addWindowListener(new WindowAdapter() {

   public void windowClosing(WindowEvent e) {

    System.out.println("用户试图关闭窗口");

    disconnect();

    System.exit(0);

   }

 

  });

  // textFieldContent添加回车事件

  textFieldContent.addActionListener(new ActionListener() {

   public void actionPerformed(ActionEvent e) {

    onClickEnter();

   }

  });

 

  // 建立连接

  connect();

  new Thread(new ReciveMessage()).start();

 }

 

 private class ReciveMessage implements Runnable {

  @Override

  public void run() {

   flag = true;

   try {

    while (flag) {

     String message = dis.readUTF();

     textAreaContent.append(message + "\n");

    }

   } catch (EOFException e) {

    flag = false;

    System.out.println("客户端已关闭");

    // e.printStackTrace();

   } catch (SocketException e) {

    flag = false;

    System.out.println("客户端已关闭");

    // e.printStackTrace();

   } catch (IOException e) {

    flag = false;

    System.out.println("接受消息失败");

    e.printStackTrace();

   }

  }

 

 }

 

 /**

  * 功能:当点击回车时触发事件

  */

 private void onClickEnter() {

  String message = textFieldContent.getText().trim();

  if (message != null && !message.equals("")) {

   String time = new SimpleDateFormat("h:m:s").format(new Date());

   textAreaContent.append(time + "\n" + message + "\n");

   textFieldContent.setText("");

   sendMessageToServer(message);

  }

 }

 

 /**

  * 功能:给服务器发送消息

  *

  * @param message

  */

 private void sendMessageToServer(String message) {

  try {

   dos.writeUTF(message);

   dos.flush();

  } catch (IOException e) {

   System.out.println("发送消息失败");

   e.printStackTrace();

  }

 }

 

 /**

  * 功能:申请socket链接

  */

 private void connect() {

  try {

   socket = new Socket("localhost", 8888);

   out = socket.getOutputStream();

   dos = new DataOutputStream(out);

   in = socket.getInputStream();

   dis = new DataInputStream(in);

  } catch (UnknownHostException e) {

   System.out.println("申请链接失败");

   e.printStackTrace();

  } catch (IOException e) {

   System.out.println("申请链接失败");

   e.printStackTrace();

  }

 }

 

 /**

  * 功能:关闭流和链接

  */

 private void disconnect() {

  flag = false;

  if (dos != null) {

   try {

    dos.close();

   } catch (IOException e) {

    System.out.println("dos关闭失败");

    e.printStackTrace();

   }

  }

  if (out != null) {

   try {

    out.close();

   } catch (IOException e) {

    System.out.println("dos关闭失败");

    e.printStackTrace();

   }

  }

  if (socket != null) {

   try {

    socket.close();

   } catch (IOException e) {

    System.out.println("socket关闭失败");

    e.printStackTrace();

   }

   ;

  }

 }

 

}

 

ChatServer:

 

public class ChatServer {

 

 private List<Client> clients = new ArrayList<>();

 

 /**

  * 功能:启动ChatSever

  *

  * @param args

  */

 public static void main(String[] args) {

  new ChatServer().init();

 }

 

 /**

  * 功能:对chatserver初始化

  */

 private void init() {

  System.out.println("服务器已开启");

  // BindException

 

  ServerSocket ss = null;

  Socket socket = null;

  try {

   ss = new ServerSocket(8888);

  } catch (BindException e) {

   System.out.println("端口已被占用");

   e.printStackTrace();

  } catch (IOException e1) {

   e1.printStackTrace();

  }

  try {

   Client client = null;

   while (true) {

    socket = ss.accept();

    System.out.println("客户驾到");

    client = new Client(socket);

    clients.add(client);

    new Thread(client).start();

   }

  } catch (IOException e) {

   e.printStackTrace();

  }

 }

 

 private class Client implements Runnable {

  private Socket socket = null;

  InputStream in = null;

  DataInputStream din = null;

  OutputStream out = null;

  DataOutputStream dos = null;

  boolean flag = true;

 

  public Client(Socket socket) {

   this.socket = socket;

   try {

    in = socket.getInputStream();

    din = new DataInputStream(in);

   } catch (IOException e) {

    System.out.println("接受消息失败");

    e.printStackTrace();

   }

 

  }

 

  public void run() {

 

   String message;

   try {

    while (flag) {

     message = din.readUTF();

     // System.out.println("客户说:" + message);

     forwordToAllClients(message);

    }

   } catch (SocketException e) {

    flag = false;

    System.out.println("客户下线");

    clients.remove(this);

    // e.printStackTrace();

   } catch (EOFException e) {

    flag = false;

    System.out.println("客户下线");

    clients.remove(this);

    // e.printStackTrace();

   } catch (IOException e) {

    flag = false;

    System.out.println("接受消息失败");

    clients.remove(this);

    e.printStackTrace();

   }

 

   if (din != null) {

    try {

     din.close();

    } catch (IOException e) {

     System.out.println("din关闭失败");

     e.printStackTrace();

    }

   }

   if (in != null) {

    try {

     in.close();

    } catch (IOException e) {

     System.out.println("din关闭失败");

     e.printStackTrace();

    }

   }

   if (socket != null) {

    try {

     socket.close();

    } catch (IOException e) {

     System.out.println("din关闭失败");

     e.printStackTrace();

    }

   }

 

  }

 

  /**

   * 功能:转发给所有客户端

   *

   * @param message

   * @throws IOException

   */

  private void forwordToAllClients(String message) throws IOException {

   for (Client c : clients) {

    if (c != this) {

     out = c.socket.getOutputStream();

     dos = new DataOutputStream(out);

     forwordToClient(message);

    }

   }

  }

 

  /**

   * 功能:发送给一个客户端

   *

   * @throws IOException

   */

  private void forwordToClient(String message) throws IOException {

   dos.writeUTF(message);

   dos.flush();

   System.out.println("转发成功!");

  }

 

 }

}

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

©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值