基于UDP协议实现聊天系统

基于UDP协议的聊天系统的实现(含GUI),供大家参考,具体内容如下

这是一篇我的学习记录,这学期加入了JAVA 的学习,所以自己把教科书看了一下,然后尝试地写了一个UDP协议的聊天系统,并且含GUI。因为对JAVA和网络的了解还不够深,所以代码还有许多地方需要完善。

代码展示

下面展示一些 Client类

/**-------------------
 * 发送端
 **---------------------*/
class Client extends Thread{
    private static String content;       //发送内容
    private static int port;             //发送端口
    private static int target;           //目标端口
    private static byte[] addr;          //目标ip地址
        /**-------------------
         *构造函数
         **---------------------*/
    public Client(String content,int port,int target,byte[] addr){
        this.content=content;
        this.port=port;
        this.target=target;
        this.addr=addr;
    }
        /**-------------------
         *发送端函数
         **---------------------*/
    public void run(){
        DatagramSocket client= null;
        try {
            //定义发送端端口为 port 的DatagramSocket对象
            client = new DatagramSocket(port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
        String str=content;

        DatagramPacket packet= null;
        try {
            //定义DatagramPacket对象,用于封装发送的数据以及目标地址 target
            packet = new DatagramPacket(str.getBytes(),str.getBytes().length,
                    InetAddress.getByAddress(addr),target);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        try {
            //发送数据
            client.send(packet);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //关闭释放资源
        client.close();
    }
}

    /**-------------------
     *接收端
     **---------------------*/
class Server extends Thread{
    private static JTextArea jt;           //对话框
    private static int target;             //目标端口
        /*-------------------
              构造函数
        ---------------------*/
    public  Server(JTextArea jt,int target){
        this.jt=jt;
        this.target=target;
    }

下面展示一些 Server类

    /*-------------------
    接收端
    ---------------------*/
class Server extends Thread{
    private static JTextArea jt;           //对话框
    private static int target;             //目标端口
        /*-------------------
              构造函数
        ---------------------*/
    public  Server(JTextArea jt,int target){
        this.jt=jt;
        this.target=target;
    }

        /*-------------------
              接收端函数
        ---------------------*/
    public void run(){
        String str;
        DatagramSocket server= null;

        try {
            //定义一个端口号为 target 的接收端DatagramSocket对象
            server = new DatagramSocket(target);
        } catch (SocketException e) {
            e.printStackTrace();
        }
        byte[] buf=new byte[1024];
        //定义一个DatagramPacket数据报对象,用于封装接收数据
        DatagramPacket packet=new DatagramPacket(buf, buf.length);

        while (true){
            try {
                //等待接收数据,在数据没有被接收到之前会被堵塞
                server.receive(packet);
            } catch (IOException e) {
                e.printStackTrace();
            }
            //使用DatagramPacket的方法获得接收到的信息,并转为字符串类型
            str=new String(packet.getData(),
                    0,packet.getLength());
            //将接收到的信息打印到对话框
            jt.append("接收到:"+str+"\n");
        }
    }
}

下面展示一些 Main类

public class Main {
    public static int port;
    public static int target;
    public static byte[] addr;
    public static void Login(){
        System.out.print("请输入端口号:");
        Scanner ScPort=new Scanner(System.in);
        port=ScPort.nextInt();

        System.out.print("请输入目标端口号1:");
        Scanner ScTarget=new Scanner(System.in);
        target=ScTarget.nextInt();

        System.out.print("请输入目标端口号2:");
        Scanner ScTarget2=new Scanner(System.in);
        int target2=ScTarget2.nextInt();

        System.out.print("请输入目标IP地址:");
        Scanner Scaddr=new Scanner(System.in);
        /*---------------------
        将目标IP存储到数组中
        -----------------------*/
        String ip=Scaddr.nextLine();
        /*---------------------
        public String[] split(String regex):
             根据给定正则表达式的匹配拆分此字符串
         ----------------------*/
        String[] ii=ip.split("\\.");
        /*---------------------
        我们现在使用的IPv4是用一个32位的二进制数来存储的,为了方便记忆,
        会将其分成4个8位的二进制数(4个一字节的二进制数),每8位之间用圆点隔开。
        而每8位二进制数可以转换为一个0~255的十进制数,例如103.42.176.244,
        这种写法被称为点数表示法
         ----------------------*/
        byte[] addr=new byte[4];
        for(int i=0;i<4;i++){
            addr[i]=(byte)(Integer.parseInt(ii[i]));
        }

        System.out.println("窗口启动中....");
        new Thread(new Server(CreateAndShowGUI(port,target,addr),target2),"接收服务").start();
    }
    /*-------------------
    GUI界面
    ---------------------*/
    public static JTextArea CreateAndShowGUI(int port,int target,byte[] addr){
        /*---------------------
        创建界面
         ----------------------*/
        JFrame jf=new JFrame("聊天界面");
        jf.setLocation(400,200);
        jf.setSize(400,300);
        /*---------------------
        设置布局
         ----------------------*/
        jf.setLayout(new BorderLayout());
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        /*---------------------
        创建聊天窗口
         ----------------------*/
        JTextArea jt=new JTextArea(14,34);
        JScrollPane scrollPane=new JScrollPane(jt);
        jt.setEditable(false);
        /*---------------------
        创建发送窗口
         ----------------------*/
        JTextField jte=new JTextField(20);

        JButton jb=new JButton("发送");
        jb.addActionListener(e->{
            String content=jte.getText();
            /*---------------------
            为发送按钮创建动作
             ----------------------*/
            if (content!=null&&!content.trim().equals("")){
                /*-------------------
                判断信息是否为空
                若为空,在在对话框提示 你输入的内容为空
                反之发送
                 --------------------*/
                jt.append("输入信息为:"+content+"\n");
                /*--------------
                将发送框信息发送到目标对话框
                传入Client方法的参数分别为
                “发送内容,发送端口,目标端口,目标IP地址”
                ----------------*/
                try {
                    new Thread(new Client(content,port,target,addr),"发送服务").start();
                } catch (Exception exception) {
                    exception.printStackTrace();
                }
            }else{
                jt.append("你输入的内容为空");
            }
            jte.setText("");      //信息发送后,将发送框重置
        });

        JPanel jp=new JPanel();
        JLabel jl=new JLabel("聊天信息");

        jp.add(jl);
        jp.add(jte);
        jp.add(jb);
        jf.add(jt,BorderLayout.PAGE_START);
        jf.add(jp,BorderLayout.PAGE_END);
        //显示GUI界面
        jf.setVisible(true);
        return jt;
    }

    public static void main(String[] args) throws Exception{
        Login();
    }
}

运行截图

登录界面(一)

登录界面(二)

聊天界面(一)

聊天界面(二)

总结

UDP协议是无连接通信,即在数据传输时,数据的发送端和接收端不建立逻辑链接。也就是,当一台计算机想另外一台计算机发送消息时,发送端不会确定接收端是否存在,就会发送数据。同样,接收端在接收到消息后也不会反馈发送端是否受到数据。但UDP消耗资源小、通讯效率高、延迟小。所以,虽然UDP是一个不可靠的协议,但它是分发信息的一个理想协议。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java UDP实现一个聊天工具的示例代码

    题目: 假设Tom和Jerry利用Java UDP进行聊天,请为他们编写程序.具体如下: (1).Tom和Jerry聊天的双方都应该具有发送端和接收端: (2).利用DatagramSocket与DatagramPacket: (3).实现 java.lang.Runnable类,重写 run()方法. 学过计网的都知道,利用三元组(ip地址,协议,端口)就可以标识网络的进程了. 而进行通信我们直接运用socket就可以了,首先需要知道是socket是什么,这部分可以参考这个大佬写的博客. ht

  • java网络之基于UDP的聊天程序示例解析

    基于UDP的Socket通信 UDP协议不是一种基于稳定连接的协议,是一种面向数据报包的通信协议,不需要通信双方建立稳定的连接,也没有所谓服务端和客户的概念,数据报包在传输的时候不保证一定及时到达,也不能保证数据报包的到达顺序,但是UDP协议传输效率要远高于TCP/IP. 以下是一个基于UDP的简单的消息发送接收程序. 消息发送方 1.创建一个数据报的网络通道 DatagramSocket ds = new DatagramSocket(); 2.准备需要传输的数据 String msg = "

  • java中UDP简单聊天程序实例代码

    学过计算机网络通信的都知道,计算机之间传送数据由两种,即TCP通信和UDP通信.TCP是可靠的面向连接的通信协议,二UDP是不可靠的面向无连接的通信协议. java中有基于TCP的网络套接字通信,也有基于UDP的用户数据报通信,UDP的信息传输速度快,但不可靠! 基于UDP通信的基本模式: (1)将数据打包,称为数据包(好比将信件装入信封一样),然后将数据包发往目的地. (2)接受别人发来的数据包(好比接收信封一样),然后查看数据包中的内容. 客户机 复制代码 代码如下: package com

  • 基于UDP实现聊天室功能

    本文实例为大家分享了UDP实现聊天室功能的具体代码,供大家参考,具体内容如下 项目结构 data.java package udp; import java.net.InetAddress; public class data { InetAddress Address; int Port; public InetAddress getAddress() { return Address; } public void setAddress(InetAddress address) { Addre

  • Java基于UDP协议实现简单的聊天室程序

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

  • 基于UDP协议实现聊天系统

    基于UDP协议的聊天系统的实现(含GUI),供大家参考,具体内容如下 这是一篇我的学习记录,这学期加入了JAVA 的学习,所以自己把教科书看了一下,然后尝试地写了一个UDP协议的聊天系统,并且含GUI.因为对JAVA和网络的了解还不够深,所以代码还有许多地方需要完善. 代码展示 下面展示一些 Client类. /**------------------- * 发送端 **---------------------*/ class Client extends Thread{ private st

  • Python+Socket实现基于UDP协议的局域网广播功能示例

    本文实例讲述了Python+Socket实现基于UDP协议的局域网广播功能.分享给大家供大家参考,具体如下: 服务器端: # udp_gb_server.py '''服务端(UDP协议局域网广播)''' import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) PORT = 1060 network = '<b

  • java编程实现基于UDP协议传输数据的方法

    本文实例讲述了java编程实现基于UDP协议传输数据的方法.分享给大家供大家参考,具体如下: UDP协议(User Datagram Protocol,用户数据报协议)不同于TCP协议,它是不可能靠的,但是它比TCP协议具有更快的传输速度,UDP发送的数据单元称为数据报,当网络传输UDP传输UDP数据报是无法保证数据能够到达目的地,也无法保证按发送的顺序到达目的地,也就是说先发送了"hello",再发送了"world",但接收方可能会先收到"world&q

  • java实现基于UDP协议网络Socket编程(C/S通信)

    一.前言:认识UDP UDP,全称User Datagram Protocol(用户数据报协议),是Internet 协议集支持一个无连接的传输协议.UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法. UDP主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成,提供面向报文的简单不可靠信息传送服务.UDP 协议基本上是IP协议与上层协议的接口,适用端口分别运行在同一台设备上的多个应用程序. 二.UDP的特点(与TCP相比) 正是UDP提供不可靠服务

  • Java 基于UDP协议实现消息发送

    发短信:不用连接,但需要知道对方的地址,客户端.服务端没有明确的界限,可以说没有客户端.服务端一说. 发送端 package lesson03; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /** * 发送端 */ public class UdpClientDemo1 { public static void main(String[] args) th

  • java实现基于UDP协议的聊天小程序操作

    UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议.它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去! UDP适用于一次只传送少量数据.对可靠性要求不高的应用环境.正因为UDP协议没有连接的过程,所以它的通信效率高:但也正因为如此,它的可靠性不如TCP协议高.QQ就使用UDP发消息,因此有时会出现收不到消息的情况. 利用UDP协议的发送和接收,模拟聊天小程序 创建聊天程序的A端: 1.发送信息到接收端                 1 .准

  • Java基于UDP协议的聊天室功能

    UDP简述 UDP(User Datagram Protocol)协议是Internet 协议集支持的一个无连接的传输协议,中文名为用户数据报协议.它为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据报的方法. Internet 的传输层有两个主要协议,互为补充.无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情.面向连接的是TCP,该协议几乎做了所有的事情.“when in trouble , use TCP”. 那

  • python实现简单tftp(基于udp协议)

    本文实例为大家分享了python实现简单tftp的具体代码,供大家参考,具体内容如下 tftp是基于udp的协议 实现简单的tftp,首先要有tftp的协议图. tftp默认接收端口为69,但每次有连接过来后,tftp会随机分配一个端口来专门为这个连接来服务. 操作码:1.上传 2.下载 3.传数据 4.接收确认 5.错误码 tftp服务器简单实现: from threading import Thread from socket import * import struct def uploa

  • 解析C语言基于UDP协议进行Socket编程的要点

    两种协议 TCP 和 UDP 前者可以理解为有保证的连接,后者是追求快速的连接. 当然最后一点有些 太过绝对 ,但是现在不需熬考虑太多,因为初入套接字编程,一切从简. 稍微试想便能够大致理解, TCP 追求的是可靠的传输数据, UDP 追求的则是快速的传输数据. 前者有繁琐的连接过程,后者则是根本不建立可靠连接(不是绝对),只是将数据发送而不考虑是否到达. 以下例子以 *nix 平台的便准为例,因为 Windows平台需要考虑额外的加载问题,稍作添加就能在 Windows 平台上运行UDP. U

随机推荐