Java Socket 实现简易单客户端聊天功能
本文介绍如何使用 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 监听指定端口,等待客户端连接。由于本示例仅支持单客户端长时间连接,服务端代码结构相对简单,主要循环读取客户端数据。
实现步骤:
- 启动服务:创建
ServerSocket实例并绑定端口 (如 8888)。 - 接受连接:调用
accept()阻塞等待客户端连接。 - 数据读取:获取输入流后,通过
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聊天的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









