基于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的图片

下面是聊天界面

时间: 2024-09-30 06:33:51

基于UDP协议的聊天室(java实现)的相关文章

15.基于UDP协议的聊天室程序

使用UDP协议完成一个聊天室程序的小项目,大部分代码都有注释,一看就能看到的. 实现的功能:               (1)查看/显示已经登陆的用户信息               (2)向已登陆的用户发送消息               (3)输出错误消息,给予提示               (4)退出 共有三个文件: chat_public.h #ifndef _CHAT_PUB_H_ #define _CHAT_PUB_H_ //chat_public.h #include <lis

基于udp的局域网聊天室

需要实现功能如下: 1.服务器端功能如下: 广播通知客服端登录/退出 接受客服端发来的消息,广播给所有用户 广播系统消息 2.客服端功能如下: 接收服务器发来的消息并显示 发送消息给服务器端 实现代码如下: //***********服务端******************* 1 #include <head.h> 2 3 #define CLIENT_LOGIN 10 4 #define CLIENT_QUIT 20 5 #define CLIENT_TALK 30 6 #define S

C++开发的基于UDP协议的聊天工具

项目相关地址 源码:https://github.com/easonjim/UDPChat bug提交:https://github.com/easonjim/UDPChat/issues

Java网络编程 - 基于UDP协议 实现简单的聊天室程序

最近比较闲,一直在抽空回顾一些Java方面的技术应用. 今天没什么事做,基于UDP协议,写了一个非常简单的聊天室程序. 现在的工作,很少用到socket,也算是对Java网络编程方面的一个简单回忆. 先看一下效果: 实现的效果可以说是非常非常简单,但还是可以简单的看到一个实现原理. "聊天室001"的用户,小红和小绿相互聊了两句,"聊天室002"的小黑无人理会,在一旁寂寞着. 看一下代码实现: 1.首先是消息服务器的实现,功能很简单: 将客户端的信息(进入了哪一个聊

Java学习总结(十三)——基于UDP协议网络编程

一.UDP网络编程1.面向无连接的数据传输,不可靠的,但效率高(音频,视频等).2.UDP一次发送的数据不能超过64kb.3.UDP编程所需要的类(1)DatagramSocket此类表示用来发送和接收数据报包的套接字(2)DatagramPacket此类表示数据报包方法:DatagramPacket(byte[]?buf, int?length, InetAddress?address, int?port)参数表示:buf - 包数据length - 包长度address - 目的地址port

JAVA基础知识之网络编程——-基于UDP协议的通信例子

UDP是一种不可靠的协议,它在通信两端各建立一个socket,这两个socket不会建立持久的通信连接,只会单方面向对方发送数据,不检查发送结果. java中基于UDP协议的通信使用DatagramSocket类的receive和send方法即可,但消息需要通过一个特定的类封装(DatagramPacket) 下面是一个基于UDP协议的通信的例子, 服务器端, 1 package udp; 2 3 import java.io.IOException; 4 import java.net.Dat

Java中基于UDP协议的的网络编程(基础篇)

---恢复内容开始--- 一:什么是网络编程? 通俗的来说, 网络编程就是编写程序,让联网的两个或多个设备(例如计算机)之间进行数据传输.Java语言也支持网络编程,JDK提供的 java.net包提供了很多于网络编程相关的类,来支持网络编程方面的学习. 二:java网络编程所使用的协议? 有了计算机网络的基础,我们不难理解,在java中,网络编程是基于网络传输协议的. java网络编程,可以是基于TCP协议的,也可以基于UDP协议的.那么首先我们得知道tcp协议和udp两种协议的区别. 区别:

分享基于 websocket 网页端聊天室

博客地址:https://ainyi.com/#/67 有一个月没有写博客了,也是因为年前需求多.回家过春节的原因,现在返回北京的第二天,想想,应该也要分享技术专题的博客了!! 主题 基于 websocket 网页端聊天室 WebSocket 协议是基于 TCP 的一种新的网络协议.它实现了浏览器与服务器全双工 (full-duplex) 通信--允许服务器主动发送信息给客户端. 使用 java 开发后台 需要导入一个jar包:javax.websocket-api-1.0-rc4.jar 后台

网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服务器进程B1同时为客户进程A1.A2和B2提供服务. Socket概述 ①   所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过“套接字”向网络发出请求或者应答网络请求. ②   Socket是连接运行在网络上的两个程序间的双向通信的端点. ③