package com.szd.chat;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
public class ChatClient extends JFrame {
private JPanel contentPane;
private JTextField txtName;
private JTextField txtMsg;
JTextArea txtContent;
PrintStream ps;
BufferedReader br;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ChatClient frame = new ChatClient();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public ChatClient() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(null);
setContentPane(contentPane);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(10, 10, 414, 212);
contentPane.add(scrollPane);
txtContent = new JTextArea();
scrollPane.setViewportView(txtContent);
JLabel lblName = new JLabel("昵称:");
lblName.setFont(new Font("新宋体", Font.PLAIN, 12));
lblName.setBounds(10, 237, 54, 15);
contentPane.add(lblName);
txtName = new JTextField();
txtName.setBounds(46, 234, 66, 21);
contentPane.add(txtName);
txtName.setColumns(10);
JLabel lblMsg = new JLabel("内容:");
lblMsg.setFont(new Font("新宋体", Font.PLAIN, 12));
lblMsg.setBounds(115, 237, 54, 15);
contentPane.add(lblMsg);
txtMsg = new JTextField();
txtMsg.setBounds(145, 234, 195, 21);
contentPane.add(txtMsg);
txtMsg.setColumns(10);
JButton btnSend = new JButton("发送");
/**
* 按钮点击事件
*/
btnSend.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String name = txtName.getText();
String msg = txtMsg.getText();
/**
* 判断内容是否为空
*/
if (!"".equals(msg)) {
ps.println(name + ":" + msg);
txtMsg.setText("");
}
}
});
btnSend.setFont(new Font("新宋体", Font.PLAIN, 12));
btnSend.setBounds(342, 233, 82, 23);
contentPane.add(btnSend);
/**
* Socket
*/
try {
Socket socket = new Socket("192.168.14.38", 28888);
ps = new PrintStream(socket.getOutputStream());
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
/**
* 新开一个线程用来接收消息
*/
new GetMsgFromServerThread(br).start();
} catch (Exception e1) {
e1.printStackTrace();
}
}
/**
* 接收消息的线程
*
* @author Administrator
*
*/
class GetMsgFromServerThread extends Thread {
private BufferedReader br;
public GetMsgFromServerThread(BufferedReader br) {
this.br = br;
}
@Override
public void run() {
String str = "";
while (this.isAlive()) {
try {
str = br.readLine();
if (!"".equals(str)) {
// System.out.println(str);
txtContent.append(str + "\n\r");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
在IT行业中,网络编程是不可或缺的一部分,特别是在开发分布式系统、实时通信应用以及互联网服务时。本教程将聚焦于使用Java的Socket和ServerSocket类来构建一个基础的多人聊天室程序,这是TCP网络编程的一个经典应用。 TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在Java中,`Socket`和`ServerSocket`是进行TCP通信的核心类。`ServerSocket`用于服务器端,监听特定端口,等待客户端的连接请求;而`Socket`则用于客户端,用于建立与服务器的连接并进行数据交换。 我们需要创建一个`ServerSocket`实例,指定监听的端口号。例如: ```java ServerSocket serverSocket = new ServerSocket(6666); ``` 这个服务器会一直在6666端口上等待客户端的连接。 当有客户端尝试连接时,`ServerSocket`的`accept()`方法会阻塞,直到有新的连接请求到达。它会返回一个新的`Socket`对象,表示与客户端的连接。我们通常会使用一个循环来处理多个客户端的连接请求。 在客户端,我们创建一个`Socket`对象,指定服务器的IP地址和端口号,然后调用`connect()`方法发起连接: ```java Socket socket = new Socket("localhost", 6666); ``` 一旦连接建立,我们就可以通过`Socket`的`getInputStream()`和`getOutputStream()`方法获取输入流和输出流,从而实现数据的双向传输。 在聊天室中,服务器端需要维护一个客户端列表,并为每个连接的客户端开启一个新的线程来处理其发送的消息。同时,服务器需要将接收到的消息广播给所有在线的客户端。这样,每个客户端都能看到其他人的消息。 客户端则负责接收服务器发来的消息,并显示在界面上,同时提供一个界面让用户输入消息,然后通过输出流发送到服务器。 例如,服务器端的简化代码可能如下: ```java while (true) { Socket clientSocket = serverSocket.accept(); new Thread(new ClientHandler(clientSocket)).start(); } class ClientHandler implements Runnable { private Socket client; public ClientHandler(Socket client) { this.client = client; } @Override public void run() { BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); PrintWriter out = new PrintWriter(client.getOutputStream(), true); while (true) { String message = in.readLine(); if (message == null) break; // 客户端断开连接 broadcast(message); // 广播消息 } } } ``` 客户端的简化代码可能如下: ```java Socket socket = new Socket("localhost", 6666); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); // 在UI事件处理中 out.println(input.getText()); // 发送用户输入的消息 while (true) { String message = in.readLine(); if (message != null) displayMessage(message); // 显示接收到的消息 } ``` 以上代码仅为示例,实际应用中还需要考虑异常处理、关闭资源、线程安全等问题。在Chat文件中,应该包含了完整的实现代码,包括服务器端和客户端的逻辑,以及可能的用户界面部分。 总结来说,使用Java的Socket和ServerSocket实现多人聊天室,主要涉及TCP连接的建立、数据的双向传输以及多线程处理。这个过程不仅有助于理解网络编程的基本原理,也是实际开发中解决类似问题的基础。










































- 1

- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整

- 粉丝: 23
- 资源: 1
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 【机器人定位】基于matlab卡尔曼滤波EKF算法多机器人定位【含Matlab源码 10979期】.mp4
- 【基本链路】基于matlab稀疏码分多址SCMA基础链路仿真【含Matlab源码 11169期】.mp4
- 【快速雷达】基于matlab快速雷达冰川模拟【含Matlab源码 10016期】.mp4
- 【雷达】基于matlab对萨德系统ANTPY-2雷达的威力范围仿真计算【含Matlab源码 9707期】.mp4
- 【雷达测试】基于matlab多普勒雷达速度测量【含Matlab源码 9805期】.mp4
- 【雷达LFM】基于matlab线性调频信号LFM的随机移动频率干扰【含Matlab源码 7582期】.mp4
- 【雷达成像】基于matlab反向投影算法合成孔径雷达SAR仿真(含三维图像)【含Matlab源码 9801期】.mp4
- 【雷达成像】基于matlab合成孔径雷达SAR线性调频缩放算法CSA雷达成像【含Matlab源码 10017期】.mp4
- 【雷达成像】基于matlab分布式合成孔径雷达成像仿真(含像素级配准)【含Matlab源码 11179期】.mp4
- 基于协同过滤推荐算法的音乐推荐系统:Python+Django开发,SQLite数据库支持,MVC框架构建,解压即运行,含配套文档,基于协同过滤推荐算法的音乐推荐系统:Python+Django开发
- 【雷达成像】基于matlab距离多普勒算法RDA和CS算法成像点目标仿真(窄波束运动补偿)【含Matlab源码 9254期】.mp4
- 【雷达成像】基于matlab距离多普勒算法RDA和CS算法成像点目标仿真(宽波束运动补偿)【含Matlab源码 9255期】.mp4
- 【雷达对抗】基于matlab GUI多基线干涉仪测向虚拟仿真【含Matlab源码 11199期】.mp4
- 【雷达干扰】基于matlab汽车雷达系统中FMCW雷达干扰【含Matlab源码 10018期】.mp4
- 【雷达干扰】基于matlab雷达有源干扰识别仿真【含Matlab源码 9791期】(含论文).mp4
- 【雷达跟踪】基于matlab雷达信号目标运动轨迹跟踪(含距离和速度误差)【含Matlab源码 10015期】.mp4


