java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台(即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))的总称。
这篇文章主要介绍了 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,就可以实现多人聊天了,你也试试。
来源: http://www.phperz.com/article/17/1220/358587.html