Java Socket 实现简易单客户端聊天功能

Ada
Ada
发布时间:2026-10-13 | 1人浏览过
原创

本文介绍如何使用 Java Socket 和 AWT 组件构建一个基础的客户端-服务器聊天原型。重点解决单客户端连接服务端并保持持续通信的核心逻辑,涵盖 GUI 界面搭建、网络连接建立及数据流交互。

1. 客户端开发

客户端主要负责绘制图形用户界面 (GUI) 并处理用户输入。通过 AWT 组件构建窗口,将文本输入框 (TextField) 置于底部,聊天记录显示区 (TextArea) 置于顶部。

核心逻辑包括:

  • 界面初始化:设置窗口大小、位置,并添加布局容器。
  • 事件监听:为输入框添加 ActionListener,当用户按下回车键时触发消息发送。
  • 网络连接:在窗口可见后自动连接默认服务端地址 (127.0.0.1:8888)。
package chat.chat;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class ChatClient extends Frame {
  private TextField tfTxt = new TextField();
  private TextArea tarea = new TextArea();
  private Socket socket = null;
  private DataOutputStream dataOutputStream = null;

  public static void main(String[] args) {
    new ChatClient().launcFrame();
  }

  public void launcFrame() {
    setLocation(300, 200);
    this.setSize(200, 400);
    add(tfTxt, BorderLayout.SOUTH);
    add(tarea, BorderLayout.NORTH);
    pack();
    // 监听窗口关闭事件
    this.addWindowListener(new WindowAdapter() {
      @Override
      public void windowClosing(WindowEvent e) {
        System.exit(0);
        disConnect();
      }
    });
    // 监听回车事件
    tfTxt.addActionListener(new TFLister());
    setVisible(true);
    connect();
  }

  public void connect() {
    try {
      socket = new Socket("127.0.0.1", 8888);
      dataOutputStream = new DataOutputStream(socket.getOutputStream());
      System.out.println("连上服务端");
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  public void disConnect() {
    try {
      dataOutputStream.close();
      socket.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  private void sendMessage(String text) {
    try {
      dataOutputStream.writeUTF(text);
      dataOutputStream.flush();
    } catch (IOException e1) {
      e1.printStackTrace();
    }
  }

  private class TFLister implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
      String text = tfTxt.getText().trim();
      tarea.setText(text); // 简单回显
      tfTxt.setText("");
      sendMessage(text);
    }
  }
}

2. 服务端开发

服务端通过 ServerSocket 监听指定端口,等待客户端连接。由于本示例仅支持单客户端长时间连接,服务端代码结构相对简单,主要循环读取客户端数据。

实现步骤:

  1. 启动服务:创建 ServerSocket 实例并绑定端口 (如 8888)。
  2. 接受连接:调用 accept() 阻塞等待客户端连接。
  3. 数据读取:获取输入流后,通过 readUTF() 读取客户端发送的消息。
package chat.chat;
import java.io.DataInputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;

public class ChatServer {
  public static void main(String[] args) {
    boolean isStart = false;
    ServerSocket ss = null;
    Socket socket = null;
    DataInputStream dataInputStream = null;
    
    try {
      ss = new ServerSocket(8888);
    } catch (BindException e) {
      System.out.println("端口已在使用中");
      System.exit(0);
    } catch (Exception e) {
      e.printStackTrace();
    }

    try {
      isStart = true;
      while (isStart) {
        boolean isConnect = false;
        socket = ss.accept();
        System.out.println("one client connect");
        isConnect = true;
        while (isConnect) {
          dataInputStream = new DataInputStream(socket.getInputStream());
          String message = dataInputStream.readUTF();
          System.out.println("客户端说:" + message);
        }
      }
    } catch (EOFException e) {
      System.out.println("client closed!");
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        if(dataInputStream != null) dataInputStream.close();
        if(socket != null) socket.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
}

3. 运行与测试

确保先启动服务端程序,再启动客户端程序。如果在连接过程中遇到错误,请检查以下事项:

  • 端口占用:确认 8888 端口未被其他进程占用。
  • 防火墙设置:确保本地防火墙允许该端口的通信。
  • 异常处理:若出现 java.net.ConnectException,通常表示服务端未启动或地址不正确。

此版本仅为基础演示,后续扩展需引入多线程以支持多客户端并发及消息转发功能。

以上就是Java Socket实现简易在线聊天功能的详细内容,更多关于Java Socket聊天的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表