本程序可以支持多个用户同时再局域网环境下在线进行聊天,本程序采用Java GUI 多线程 UDP技术,将一个客户端发送的消息通过内置服务器端发送到所有在线的客户端中
源码如下:
客户端一:
package ChatRoom;
import org.junit.Test;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
public class ChatRoomGUI extends JFrame {
private JTextField messageField;
private JTextArea chatArea;
DatagramSocket socket = null;
public ChatRoomGUI() {
super("用户1");
// 创建GUI组件
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
//聊天记录记录框
chatArea = new JTextArea();
chatArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(chatArea);
panel.add(scrollPane, BorderLayout.CENTER);
//文本和按钮记录框
JPanel bottomPanel = new JPanel();
bottomPanel.setLayout(new BorderLayout());
messageField = new JTextField();
bottomPanel.add(messageField, BorderLayout.CENTER);
JButton sendButton = new JButton("发送");
bottomPanel.add(sendButton, BorderLayout.EAST);
panel.add(bottomPanel, BorderLayout.SOUTH);
// 设置窗口属性
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setContentPane(panel);
setSize(500, 400);
setLocationRelativeTo(null);
setVisible(true);
//设置套接字,链接服务器
try {
socket = new DatagramSocket(8888);
} catch (SocketException e) {
throw new RuntimeException(e);
}
//开启接受消息的线程
Thread th = new Thread(new client(chatArea,socket,"用户二"));//接受消息的线程是一直开着的
th.start();
sendButton.addActionListener(new MyAction(messageField,socket,chatArea));
}
}
class MyAction implements ActionListener{
private JTextField text;
private DatagramSocket socket;
private JTextArea area;
public MyAction(JTextField text,DatagramSocket socket ,JTextArea area) {
this.text = text;
this.socket = socket;
this.area = area;
}
@Override
public void actionPerformed(ActionEvent e) {
String str = text.getText();
DatagramPacket packet = new DatagramPacket(str.getBytes(),0,str.getBytes().length,new InetSocketAddress("127.0.0.1",9999));
area.append("我: "+str+'\n');
try {
socket.send(packet);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}
客户端2:
package ChatRoom;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
public class ChatRoomGUI2 extends JFrame {
private JTextField messageField;
private JTextArea chatArea;
DatagramSocket socket;
public ChatRoomGUI2() {
super("用户二");
// 创建GUI组件
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
//聊天记录记录框
chatArea = new JTextArea();
chatArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(chatArea);
panel.add(scrollPane, BorderLayout.CENTER);
//文本和按钮记录框
JPanel bottomPanel = new JPanel();
bottomPanel.setLayout(new BorderLayout());
messageField = new JTextField();
bottomPanel.add(messageField, BorderLayout.CENTER);
JButton sendButton = new JButton("发送");
bottomPanel.add(sendButton, BorderLayout.EAST);
panel.add(bottomPanel, BorderLayout.SOUTH);
// 设置窗口属性
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setContentPane(panel);
setSize(500, 400);
setLocationRelativeTo(null);
setVisible(true);
//设置套接字,链接收入服务器
try {
socket = new DatagramSocket(9999);
} catch (SocketException e) {
throw new RuntimeException(e);
}
Thread th = new Thread(new client(chatArea,socket,"用户一"));
th.start();
sendButton.addActionListener(new Myaction6(messageField,socket,chatArea));
}
}
class Myaction6 implements ActionListener{
private JTextField text;
private DatagramSocket socket;
private JTextArea area;
public Myaction6(JTextField text,DatagramSocket socket,JTextArea area){
this.text = text;
this.socket = socket;
this.area=area;
}
@Override
public void actionPerformed(ActionEvent e) {
String str = text.getText();
DatagramPacket pack = new DatagramPacket(str.getBytes(),0,str.getBytes().length,new InetSocketAddress("127.0.0.1",8888));
area.append("我: "+str+'\n');
try {
socket.send(pack);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}
信息接收服务器
package ChatRoom;
import javax.swing.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class client implements Runnable{//接受消息的线程
private JTextArea text;
private DatagramSocket socket;
private String name;
public client(JTextArea text, DatagramSocket socket,String name){
this.name=name;
this.text=text;
this.socket = socket;
}
@Override
public void run() {
try{
while(true){
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
socket.receive(packet);
text.append(name+": "+new String(buffer,0,packet.getLength())+'\n');
}
}catch(Exception e){
e.printStackTrace();
}
}
}
信息接收服务器采用多线程技术,避免在多条消息进入后产生线程堵塞的问题
exe可执行文件可供下载