基于Java GUI 多线程 UDP网络编程的小型聊天软件

本程序可以支持多个用户同时再局域网环境下在线进行聊天,本程序采用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可执行文件可供下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值