基于UDP协议的聊天室(java实现)

主要思路很简单:

1.设置自己的接收端口

2.设置对方IP和端口

3.发送数据和接收数据

 

下面是主要代码:

复制代码
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;

public class QQFrame extends JFrame implements Runnable
{
    private JTextArea sendArea = new JTextArea(20,20);
    private JTextArea showArea = new JTextArea(10,20);
    private JButton sendButton = new JButton("发送");
    private MenuBar menuBar = new MenuBar();
    private Menu setMenu = new Menu("设置");
    private Menu helpMenu = new Menu("帮助");
    private MenuItem aboutItem = new MenuItem("关于");    
    private MenuItem setItem = new MenuItem("配置参数");
    private Thread thread = new Thread(this);
    private Config config = new Config();
    private JDialog dialog = new JDialog(this,"参数配置",true);
    private int myPort;
    QQFrame(int in_myPort)
    {
        super("局域网聊天工具");
        setResizable(false);
        myPort = in_myPort;
        setItem.addActionListener(new SetDialog(dialog,this));
        aboutItem.addActionListener(new AboutDialog(this));
        initLayout();
        sendButton.addActionListener(new SendListener(this,sendArea,showArea,config));
        thread.start();
        addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });
    }
    void initLayout()
    {
        int w,h;
        w = 400;
        h = 500;
        setBounds(100,100,w,h);
        setVisible(true);
        setLayout(new GridLayout(3,1,10,15));
        JPanel jp1,jp2;
        jp1 = new JPanel();
        jp2 = new JPanel();
        JLabel jl1;
        jl1 = new JLabel("聊天记录框:");
        jp1.setLayout(null);
        jp1.add(jl1);
        jl1.setBounds(0,0,w,20);
        jp1.add(showArea);
        showArea.setBounds(0,30,w,h/3-20);
        JLabel jl2;
        jp2.setLayout(null);
        jl2 = new JLabel("发送框:");
        jp2.add(jl2);
        jl2.setBounds(0,0,w,20);
        sendArea.setBounds(0,30,w,h/3-20);
        jp2.add(sendArea);
        JPanel jp3 = new JPanel();
        add(jp1);
        add(jp2);
        add(jp3);
        jp3.add(sendButton);
        setMenuBar(menuBar);
        menuBar.add(setMenu);
        menuBar.add(helpMenu);
        helpMenu.add(aboutItem);
        setMenu.add(setItem);
        dialog.setBounds(120,150,200,250);
        JLabel IPLabel = new JLabel("对方IP");
        JLabel yourPortLabel = new JLabel("对方接收端口");
        JLabel nameLabel = new JLabel("本机名");
        JTextField IPTextField = new JTextField(15);
        JTextField yourPortTextField = new JTextField(8);
        JTextField nameTextField = new JTextField(15);
        IPTextField.setText("127.0.0.1");
        yourPortTextField.setText("879");
        nameTextField.setText("hanxi");
        
        dialog.setLayout(new GridLayout(4,2,10,10));
        dialog.add(IPLabel);
        dialog.add(IPTextField);
        dialog.add(yourPortLabel);
        dialog.add(yourPortTextField);
        dialog.add(nameLabel);
        dialog.add(nameTextField);
        dialog.add(new Panel());
        JButton sureButton = new JButton("确定");
        dialog.add(sureButton);
        sureButton.addActionListener(new SureListener(IPTextField,yourPortTextField,nameTextField,dialog,config));
    }
    public void run()
    {
        DatagramPacket dp = null;
        DatagramSocket ds = null;
        byte[] buf = new byte[1024];
        try
        {
            dp = new DatagramPacket(buf,buf.length);
            ds = new DatagramSocket(myPort);
            System.out.println("myport="+myPort);
        }
        catch (Exception e)
        {}
        while (true)
        {
            try
            {
                ds.receive(dp);
                int length = dp.getLength();
                InetAddress address = dp.getAddress();
                int port = dp.getPort();
                String message = new String(dp.getData(),0,length);
                showArea.append("收到数据长度:"+length+"\n");
                showArea.append("收到数据来自:"+address+"端口:"+port+"\n");
                showArea.append("收到数据是:"+message+"\n");
            }
            catch (Exception e)
            {
            }
        }        
    }
}

//发送事件
class SendListener implements ActionListener
{
    private JFrame QQFrame;
    private JTextArea sendArea;
    private JTextArea showArea;
    private Config config;
    SendListener(JFrame in_QQFrame, JTextArea in_sendArea, JTextArea in_showArea, Config in_config)
    {
        QQFrame = in_QQFrame;
        sendArea = in_sendArea;
        showArea =in_showArea;
        config = in_config;
        System.out.println("in_port:"+config.getyourPort());
        QQFrame.validate();
    }

    public void actionPerformed(ActionEvent e)
    {
        System.out.println("你点击了发送按钮");
        byte[] buf = sendArea.getText().trim().getBytes();
        try
        {
            InetAddress address = InetAddress.getByName(config.getIP());
            DatagramPacket dp = new DatagramPacket(buf,buf.length,address,Integer.parseInt(config.getyourPort()));
            DatagramSocket ds = new DatagramSocket();
            showArea.append("数据包目标地址:"+dp.getAddress()+"\n");
            showArea.append("数据包目标端口号:"+dp.getPort()+"\n");
            showArea.append("数据包长度:"+dp.getLength()+"\n");
            ds.send(dp);
        }
        catch (Exception ee) {}
    }
}

//配置设置
class SetDialog implements ActionListener
{
    private JDialog dialog;
    private JFrame frame;
    SetDialog(JDialog in_dialog,JFrame parent)
    {
        dialog = in_dialog;
        frame = parent;
    }
    public void actionPerformed(ActionEvent e)
    {
        dialog.validate();
        int x = frame.getX();
        int y = frame.getY();
        dialog.setBounds(x+50,y+50,200,250);
        dialog.setVisible(true);
    }
}
//关于对话框
class AboutDialog extends JDialog implements ActionListener
{
    private JFrame frame;
    private JLabel jl = new JLabel("感谢您的使用,作者:涵曦");
    AboutDialog(JFrame parent)
    {
        frame = parent;
        add(jl);
    }
    public void actionPerformed(ActionEvent e)
    {
        validate();
        int x = frame.getX();
        int y = frame.getY();
        setBounds(x+50,y+50,200,250);
        setVisible(true);
    }
}
//对话框的确定按钮事件
class SureListener implements ActionListener
{
    JTextField IPTextField;
    JTextField yourPortTextField;
    JTextField nameTextField;
    private Dialog dialog;
    private Config config;
    
    SureListener(JTextField in_IPTextField,JTextField in_yourPortTextField,JTextField in_nameTextField,JDialog in_dialog,Config in_config)
    {
        IPTextField = in_IPTextField;
        yourPortTextField = in_yourPortTextField;
        nameTextField = in_nameTextField;
        dialog = in_dialog;
        config = in_config;
    }
    public void actionPerformed(ActionEvent e)
    {
        config.set(IPTextField.getText(),yourPortTextField.getText(),nameTextField.getText());
        System.out.println("config:yourPort:"+config.getyourPort());
        dialog.setVisible(false);
    }
}
//参数
class Config
{
    private String IP="127.0.0.1";
    private String yourPort="666";
    private String name="hanxi";

    public void set(String in_IP, String in_yourPort,String in_name)
    {
        IP = in_IP;
        yourPort = in_yourPort;
        name = in_name;
    }
    public String getIP()
    {
        return IP;
    }
    public String getyourPort()
    {
        return yourPort;
    }
    public String getName()
    {
        return name;
    }
}
复制代码

下面是主方法代码:

复制代码
public class QQ
{
    public static void main(String args[])
    {
        if (args.length == 0)
        {
            System.out.println("请在QQ后面输入接收数据的端口号(需要空格)!");
            System.exit(0);
        }
        System.out.println(Integer.parseInt(args[0]));
        QQFrame frame = new QQFrame(Integer.parseInt(args[0]));
    }
}
复制代码

设置端口和IP的图片

 

下面是聊天界面

 

转载于:https://www.cnblogs.com/lyx2018/p/7150601.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以给你提供一个Java基于UDP协议实现简单的聊天程序,具体内容如下: ```java import java.net.*; import java.io.*; public class ChatRoom { public static void main(String[] args) throws IOException { DatagramSocket socket = new DatagramSocket(); InetAddress address = InetAddress.getByName("localhost"); byte[] buffer; Thread sender = new Thread(new Runnable() { @Override public void run() { try { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); while (true) { String message = reader.readLine(); buffer = message.getBytes(); DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, 4445); socket.send(packet); } } catch (IOException e) { e.printStackTrace(); } } }); Thread receiver = new Thread(new Runnable() { @Override public void run() { try { while (true) { buffer = new byte[256]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); socket.receive(packet); String message = new String(packet.getData(), 0, packet.getLength()); System.out.println("Received: " + message); } } catch (IOException e) { e.printStackTrace(); } } }); sender.start(); receiver.start(); } } ``` 这个程序实现了一个简单的聊天,可以在本地进行测试,具体实现如下: 1. 创建一个DatagramSocket实例,用于发送和接收UDP数据包。 2. 获取一个InetAddress实例,表示本机的IP地址。 3. 创建一个byte数组作为缓冲区,用于存储发送和接收的数据。 4. 创建一个发送线程和一个接收线程,分别用于发送和接收数据。 5. 发送线程从控制台读取用户输入的数据,将数据打包成DatagramPacket,并发送到指定的IP地址和端口上。 6. 接收线程从DatagramSocket中接收数据包,将数据包中的数据解码成字符串,并将其打印到控制台上。 7. 启动发送线程和接收线程。 这个程序只是一个简单的示例,还有很多可以改进的地方,例如可以添加用户名、添加图形界面等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值