最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2021年04月20日 11:52:18   作者:CosperNXL  
這篇文章主要為大家詳細介紹了基于UDP協(xié)議實現(xiàn)聊天系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

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

代碼展示

下面展示一些 Client類。

/**-------------------
 * 發(fā)送端
 **---------------------*/
class Client extends Thread{
    private static String content;       //發(fā)送內(nèi)容
    private static int port;             //發(fā)送端口
    private static int target;           //目標端口
    private static byte[] addr;          //目標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對象
            client = new DatagramSocket(port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
        String str=content;

        DatagramPacket packet= null;
        try {
            //定義DatagramPacket對象,用于封裝發(fā)送的數(shù)據(jù)以及目標地址 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;           //對話框
    private static int target;             //目標端口
        /*-------------------
              構(gòu)造函數(shù)
        ---------------------*/
    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;             //目標端口
        /*-------------------
              構(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 {
            //定義一個端口號為 target 的接收端DatagramSocket對象
            server = new DatagramSocket(target);
        } catch (SocketException e) {
            e.printStackTrace();
        }
        byte[] buf=new byte[1024];
        //定義一個DatagramPacket數(shù)據(jù)報對象,用于封裝接收數(shù)據(jù)
        DatagramPacket packet=new DatagramPacket(buf, buf.length);

        while (true){
            try {
                //等待接收數(shù)據(jù),在數(shù)據(jù)沒有被接收到之前會被堵塞
                server.receive(packet);
            } catch (IOException e) {
                e.printStackTrace();
            }
            //使用DatagramPacket的方法獲得接收到的信息,并轉(zhuǎn)為字符串類型
            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存儲到數(shù)組中
        -----------------------*/
        String ip=Scaddr.nextLine();
        /*---------------------
        public String[] split(String regex):
             根據(jù)給定正則表達式的匹配拆分此字符串
         ----------------------*/
        String[] ii=ip.split("\\.");
        /*---------------------
        我們現(xiàn)在使用的IPv4是用一個32位的二進制數(shù)來存儲的,為了方便記憶,
        會將其分成4個8位的二進制數(shù)(4個一字節(jié)的二進制數(shù)),每8位之間用圓點隔開。
        而每8位二進制數(shù)可以轉(zhuǎn)換為一個0~255的十進制數(shù),例如103.42.176.244,
        這種寫法被稱為點數(shù)表示法
         ----------------------*/
        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){
        /*---------------------
        創(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)建動作
             ----------------------*/
            if (content!=null&&!content.trim().equals("")){
                /*-------------------
                判斷信息是否為空
                若為空,在在對話框提示 你輸入的內(nèi)容為空
                反之發(fā)送
                 --------------------*/
                jt.append("輸入信息為:"+content+"\n");
                /*--------------
                將發(fā)送框信息發(fā)送到目標對話框
                傳入Client方法的參數(shù)分別為
                “發(fā)送內(nèi)容,發(fā)送端口,目標端口,目標IP地址”
                ----------------*/
                try {
                    new Thread(new Client(content,port,target,addr),"發(fā)送服務").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();
    }
}

運行截圖

登錄界面(一)

登錄界面(二)

聊天界面(一)

聊天界面(二)

總結(jié)

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • idea新建maven項目沒有src目錄的操作方法

    idea新建maven項目沒有src目錄的操作方法

    這篇文章主要介紹了idea新建maven項目沒有src目錄的兩種操作方法,需要的朋友可以參考下
    2018-03-03
  • 解決mybatis plus報錯com.microsoft.sqlserver.jdbc.SQLServerException:必須執(zhí)行該語句才能獲得結(jié)果

    解決mybatis plus報錯com.microsoft.sqlserver.jdbc.SQLServerE

    這篇文章主要介紹了解決mybatis plus報錯com.microsoft.sqlserver.jdbc.SQLServerException:必須執(zhí)行該語句才能獲得結(jié)果,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 關(guān)于ThreadLocal的用法和說明及注意事項

    關(guān)于ThreadLocal的用法和說明及注意事項

    這篇文章主要介紹了關(guān)于ThreadLocal的用法和說明及注意事項,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 極簡的Resty服務端和客戶端RESTful框架

    極簡的Resty服務端和客戶端RESTful框架

    這篇文章主要為大家介紹了極簡的Resty服務端和客戶端RESTful框架的好處及作用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03
  • java使用Base64編碼實例

    java使用Base64編碼實例

    這篇文章主要介紹了java使用Base64編碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • 深入了解Java線程池:從設(shè)計思想到源碼解讀

    深入了解Java線程池:從設(shè)計思想到源碼解讀

    這篇文章將從設(shè)計思想到源碼解讀,帶大家深入了解Java的線程池,文中的示例代碼講解詳細,對我們的學習或工作有一定的幫助,需要的可以參考一下
    2021-12-12
  • SpringCloud用Zookeeper搭建配置中心的方法

    SpringCloud用Zookeeper搭建配置中心的方法

    本篇文章主要介紹了SpringCloud用Zookeeper搭建配置中心的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • SpringBoot通過@MatrixVariable進行傳參詳解

    SpringBoot通過@MatrixVariable進行傳參詳解

    這篇文章主要介紹了SpringBoot使用@MatrixVariable傳參,文章圍繞@MatrixVariable展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-06-06
  • java?Springboot對接開發(fā)微信支付詳細流程

    java?Springboot對接開發(fā)微信支付詳細流程

    最近要做一個微信小程序,需要微信支付,所以研究了下怎么在java上集成微信支付功能,下面這篇文章主要給大家介紹了關(guān)于java?Springboot對接開發(fā)微信支付的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • SpringBoot 集成Kaptcha實現(xiàn)驗證碼功能實例詳解

    SpringBoot 集成Kaptcha實現(xiàn)驗證碼功能實例詳解

    在一個web應用中驗證碼是一個常見的元素。今天給大家介紹一下kaptcha的和springboot一起使用的簡單例子。感興趣的朋友參考下吧
    2017-08-08

最新評論

兴和县| 陆丰市| 安福县| 称多县| 玉树县| 久治县| 全州县| 黔江区| 泸水县| 恭城| 达拉特旗| 弥渡县| 鄱阳县| 东乡| 玉林市| 玉树县| 兴义市| 额尔古纳市| 华安县| 盐源县| 陆河县| 徐水县| 新田县| 乌鲁木齐市| 勐海县| 封丘县| 吕梁市| 南昌县| 安岳县| 墨竹工卡县| 枞阳县| 罗田县| 繁峙县| 长兴县| 且末县| 中西区| 东山县| 晋江市| 南安市| 盱眙县| 安达市|