一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 基于UDP協(xié)議實(shí)現(xiàn)聊天系統(tǒng)

基于UDP協(xié)議實(shí)現(xiàn)聊天系統(tǒng)

2021-09-10 11:51CosperNXL Java教程

這篇文章主要為大家詳細(xì)介紹了基于UDP協(xié)議實(shí)現(xiàn)聊天系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

基于UDP協(xié)議的聊天系統(tǒng)的實(shí)現(xiàn)(含GUI),供大家參考,具體內(nèi)容如下

這是一篇我的學(xué)習(xí)記錄,這學(xué)期加入了JAVA 的學(xué)習(xí),所以自己把教科書看了一下,然后嘗試地寫了一個(gè)UDP協(xié)議的聊天系統(tǒng),并且含GUI。因?yàn)閷?duì)JAVA和網(wǎng)絡(luò)的了解還不夠深,所以代碼還有許多地方需要完善。

代碼展示

下面展示一些 Client類

/*-------------------
    發(fā)送端
    ---------------------*/
class Client extends Thread{
    private static String content;       //發(fā)送內(nèi)容
    private static int port;             //發(fā)送端口
    private static int target;           //目標(biāo)端口
    private static byte[] addr;          //目標(biāo)ip地址
        /*-------------------
          構(gòu)造函數(shù)
        ---------------------*/
    public Client(String content,int port,int target,byte[] addr){
        this.content=content;
        this.port=port;
        this.target=target;
        this.addr=addr;
    }
        /*-------------------
          發(fā)送端函數(shù)
        ---------------------*/
    public void run(){
        DatagramSocket client= null;
        try {
            //定義發(fā)送端端口為 port 的DatagramSocket對(duì)象
            client = new DatagramSocket(port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
        String str=content;

        DatagramPacket packet= null;
        try {
            //定義DatagramPacket對(duì)象,用于封裝發(fā)送的數(shù)據(jù)以及目標(biāo)地址 target
            packet = new DatagramPacket(str.getBytes(),str.getBytes().length,
                    InetAddress.getByAddress(addr),target);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        try {
            //發(fā)送數(shù)據(jù)
            client.send(packet);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //關(guān)閉釋放資源
        client.close();
    }
}

    /*-------------------
    接收端
    ---------------------*/
class Server extends Thread{
    private static JTextArea jt;           //對(duì)話框
    private static int target;             //目標(biāo)端口
        /*-------------------
              構(gòu)造函數(shù)
        ---------------------*/
    public  Server(JTextArea jt,int target){
        this.jt=jt;
        this.target=target;
    }

下面展示一些 Server類

    /*-------------------
    接收端
    ---------------------*/
class Server extends Thread{
    private static JTextArea jt;           //對(duì)話框
    private static int target;             //目標(biāo)端口
        /*-------------------
              構(gòu)造函數(shù)
        ---------------------*/
    public  Server(JTextArea jt,int target){
        this.jt=jt;
        this.target=target;
    }

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

        try {
            //定義一個(gè)端口號(hào)為 target 的接收端DatagramSocket對(duì)象
            server = new DatagramSocket(target);
        } catch (SocketException e) {
            e.printStackTrace();
        }
        byte[] buf=new byte[1024];
        //定義一個(gè)DatagramPacket數(shù)據(jù)報(bào)對(duì)象,用于封裝接收數(shù)據(jù)
        DatagramPacket packet=new DatagramPacket(buf, buf.length);

        while (true){
            try {
                //等待接收數(shù)據(jù),在數(shù)據(jù)沒有被接收到之前會(huì)被堵塞
                server.receive(packet);
            } catch (IOException e) {
                e.printStackTrace();
            }
            //使用DatagramPacket的方法獲得接收到的信息,并轉(zhuǎn)為字符串類型
            str=new String(packet.getData(),
                    0,packet.getLength());
            //將接收到的信息打印到對(duì)話框
            jt.append("接收到:"+str+"
");
        }
    }
}

下面展示一些 Main類

public class Main {
    public static int port;
    public static int target;
    public static byte[] addr;
    public static void Login(){
        System.out.print("請(qǐng)輸入端口號(hào):");
        Scanner ScPort=new Scanner(System.in);
        port=ScPort.nextInt();

        System.out.print("請(qǐng)輸入目標(biāo)端口號(hào)1:");
        Scanner ScTarget=new Scanner(System.in);
        target=ScTarget.nextInt();

        System.out.print("請(qǐng)輸入目標(biāo)端口號(hào)2:");
        Scanner ScTarget2=new Scanner(System.in);
        int target2=ScTarget2.nextInt();

        System.out.print("請(qǐng)輸入目標(biāo)IP地址:");
        Scanner Scaddr=new Scanner(System.in);
        /*---------------------
        將目標(biāo)IP存儲(chǔ)到數(shù)組中
        -----------------------*/
        String ip=Scaddr.nextLine();
        /*---------------------
        public String[] split(String regex):
             根據(jù)給定正則表達(dá)式的匹配拆分此字符串
         ----------------------*/
        String[] ii=ip.split(".");
        /*---------------------
        我們現(xiàn)在使用的IPv4是用一個(gè)32位的二進(jìn)制數(shù)來存儲(chǔ)的,為了方便記憶,
        會(huì)將其分成4個(gè)8位的二進(jìn)制數(shù)(4個(gè)一字節(jié)的二進(jìn)制數(shù)),每8位之間用圓點(diǎn)隔開。
        而每8位二進(jìn)制數(shù)可以轉(zhuǎn)換為一個(gè)0~255的十進(jìn)制數(shù),例如103.42.176.244,
        這種寫法被稱為點(diǎn)數(shù)表示法
         ----------------------*/
        byte[] addr=new byte[4];
        for(int i=0;i<4;i++){
            addr[i]=(byte)(Integer.parseInt(ii[i]));
        }

        System.out.println("窗口啟動(dòng)中....");
        new Thread(new Server(CreateAndShowGUI(port,target,addr),target2),"接收服務(wù)").start();
    }
    /*-------------------
    GUI界面
    ---------------------*/
    public static JTextArea CreateAndShowGUI(int port,int target,byte[] addr){
        /*---------------------
        創(chuàng)建界面
         ----------------------*/
        JFrame jf=new JFrame("聊天界面");
        jf.setLocation(400,200);
        jf.setSize(400,300);
        /*---------------------
        設(shè)置布局
         ----------------------*/
        jf.setLayout(new BorderLayout());
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        /*---------------------
        創(chuàng)建聊天窗口
         ----------------------*/
        JTextArea jt=new JTextArea(14,34);
        JScrollPane scrollPane=new JScrollPane(jt);
        jt.setEditable(false);
        /*---------------------
        創(chuàng)建發(fā)送窗口
         ----------------------*/
        JTextField jte=new JTextField(20);

        JButton jb=new JButton("發(fā)送");
        jb.addActionListener(e->{
            String content=jte.getText();
            /*---------------------
            為發(fā)送按鈕創(chuàng)建動(dòng)作
             ----------------------*/
            if (content!=null&&!content.trim().equals("")){
                /*-------------------
                判斷信息是否為空
                若為空,在在對(duì)話框提示 你輸入的內(nèi)容為空
                反之發(fā)送
                 --------------------*/
                jt.append("輸入信息為:"+content+"
");
                /*--------------
                將發(fā)送框信息發(fā)送到目標(biāo)對(duì)話框
                傳入Client方法的參數(shù)分別為
                “發(fā)送內(nèi)容,發(fā)送端口,目標(biāo)端口,目標(biāo)IP地址”
                ----------------*/
                try {
                    new Thread(new Client(content,port,target,addr),"發(fā)送服務(wù)").start();
                } catch (Exception exception) {
                    exception.printStackTrace();
                }
            }else{
                jt.append("你輸入的內(nèi)容為空");
            }
            jte.setText("");      //信息發(fā)送后,將發(fā)送框重置
        });

        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();
    }
}

運(yùn)行截圖

登錄界面(一)

基于UDP協(xié)議實(shí)現(xiàn)聊天系統(tǒng)

登錄界面(二)

基于UDP協(xié)議實(shí)現(xiàn)聊天系統(tǒng)

聊天界面(一)

基于UDP協(xié)議實(shí)現(xiàn)聊天系統(tǒng)

聊天界面(二)

基于UDP協(xié)議實(shí)現(xiàn)聊天系統(tǒng)

總結(jié)

UDP協(xié)議是無連接通信,即在數(shù)據(jù)傳輸時(shí),數(shù)據(jù)的發(fā)送端和接收端不建立邏輯鏈接。也就是,當(dāng)一臺(tái)計(jì)算機(jī)想另外一臺(tái)計(jì)算機(jī)發(fā)送消息時(shí),發(fā)送端不會(huì)確定接收端是否存在,就會(huì)發(fā)送數(shù)據(jù)。同樣,接收端在接收到消息后也不會(huì)反饋發(fā)送端是否受到數(shù)據(jù)。但UDP消耗資源小、通訊效率高、延遲小。所以,雖然UDP是一個(gè)不可靠的協(xié)議,但它是分發(fā)信息的一個(gè)理想?yún)f(xié)議。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://blog.csdn.net/qq_48778364/article/details/115825295

延伸 · 閱讀

精彩推薦
  • Java教程xml與Java對(duì)象的轉(zhuǎn)換詳解

    xml與Java對(duì)象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對(duì)象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程Java實(shí)現(xiàn)搶紅包功能

    Java實(shí)現(xiàn)搶紅包功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)搶紅包功能,采用多線程模擬多人同時(shí)搶紅包,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程升級(jí)IDEA后Lombok不能使用的解決方法

    升級(jí)IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級(jí),尋思已經(jīng)有好久沒有升過級(jí)了。升級(jí)完畢重啟之后,突然發(fā)現(xiàn)好多錯(cuò)誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java8中Stream使用的一個(gè)注意事項(xiàng)

    Java8中Stream使用的一個(gè)注意事項(xiàng)

    最近在工作中發(fā)現(xiàn)了對(duì)于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個(gè)非常重要的注意點(diǎn),所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7472021-02-04
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程20個(gè)非常實(shí)用的Java程序代碼片段

    20個(gè)非常實(shí)用的Java程序代碼片段

    這篇文章主要為大家分享了20個(gè)非常實(shí)用的Java程序片段,對(duì)java開發(fā)項(xiàng)目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
主站蜘蛛池模板: 日本生活中的玛丽 | 亚洲第一福利网 | 四虎影院免费视频 | 草莓视频在线免费观看 | 久久亚洲精选 | 国产精品天天影视久久综合网 | nxgx欧美 | 日韩欧美视频二区 | 91porny紧身翘臀 | 久久伊人精品青青草原2021 | 国内精品久久久久影院嫩草 | 91sao国产在线观看 | 九九大香尹人视频免费 | 日韩一品在线播放视频一品免费 | 性柔术18性13处交 | 边摸边吃奶边做爽gif动态图 | 亚洲国产五月综合网 | 精品福利视频一区二区三区 | 国产福利一区二区在线精品 | 欧美日韩亚洲综合在线一区二区 | 国产成人无精品久久久 | 国产日产国无高清码2020 | 美女污视频在线观看 | 久久精品一卡二卡三卡四卡视频版 | 日韩欧美在线视频一区二区 | 欧美亚洲国产综合在线 | 亚洲国产网址 | 精品精品国产自在香蕉网 | 2022天堂岛日产 | 欧美在线观看视频一区 | 天堂资源8中文最新版 | 国产一区二区三区水野朝阳 | 柔术一级毛片 | 青柠影视在线播放观看高清 | 欧美va在线播放免费观看 | 欧洲兽皇 | 国产精品成人一区二区1 | 好吊色永久免费视频大全 | 秋霞一级 | 性猛交娇小69hd | 日本不卡1卡2卡三卡网站二百 |