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

Java使用Socket簡單通訊詳解

 更新時間:2021年08月11日 15:18:03   作者:Aputonos  
這篇文章主要介紹了Java使用Socket簡單通訊詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下

Java實現基于Socket的簡單通信 

一.ServerSocket

1.使用JavaFX寫的小界面,方便觀察客戶端連接情況

等待客戶端連接服務器

    TextArea ta = new TextArea();
        Scene scene = new Scene(new javafx.scene.control.ScrollPane(ta), 450, 200);
        primaryStage.setTitle("Server");
        primaryStage.setScene(scene);
        primaryStage.show();

2.創(chuàng)建ServerSocket并處理客戶端連接并顯示客戶端基本信息

兩個客戶端連接后進行通信,未能實現動態(tài)處理。

        new Thread(() -> {
            try {
                ServerSocket serverSocket = new ServerSocket(8000);
                Platform.runLater(() -> {
                    ta.appendText(new Date() + " : Server started at "  + "\n");
                    ta.appendText(new Date() + " : wait to persons to join the chat" + "\n");
                });

                while (true){
                    Socket person1 = serverSocket.accept();
                    number++;
                    InetAddress inetAddress1 = person1.getInetAddress();
                    Platform.runLater(() -> {
                        ta.appendText(new Date() + ": Person"  + number + "joined the chat" + "\n");
                        ta.appendText(new Date() + ": Person"  + number + "'s host name is " + inetAddress1.getHostName() + "\n");
                        ta.appendText(new Date() + ": Person"  + number + "'s host address is " + inetAddress1.getHostAddress() + "\n");
                        ta.appendText(new Date() + ": wait for Person2 " + "\n");
                    });

                    Socket person2 = serverSocket.accept();
                    number++;
                    InetAddress inetAddress2 = person2.getInetAddress();
                    Platform.runLater(() -> {
                        ta.appendText(new Date() + ": Person"  + number + "joined the chat" + "\n");
                        ta.appendText(new Date() + ": Person"  + number + "'s host name is " + inetAddress2.getHostName() + "\n");
                        ta.appendText(new Date() + ": Person"  + number + "'s host address is " + inetAddress2.getHostAddress() + "\n");
                        ta.appendText(new Date() + ": Start the chat " + "\n");
                    });

                    new Thread(new HandleChat(person1,person2)).start();

                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();

3.新建Handle類處理接收發(fā)送兩個客戶端的消息

只實現了一人一句的效果,沒有實現一人連續(xù)發(fā)送消息對方也能正確接收。

    class HandleChat implements Runnable{
        Socket person1;
        Socket person2;

        public HandleChat(Socket person1,Socket person2){
            this.person1 = person1;
            this.person2 = person2;
        }
        @Override
        public void run() {
            try {
                DataInputStream fromPerson1 = new DataInputStream(person1.getInputStream());
                DataOutputStream toPerson1 = new DataOutputStream(person1.getOutputStream());
                DataInputStream fromPerson2 = new DataInputStream(person2.getInputStream());
                DataOutputStream toPerson2 = new DataOutputStream(person2.getOutputStream());

                while (true){

                    String passage1 = fromPerson1.readUTF();
                    toPerson2.writeUTF(passage1);
                    String passage2 = fromPerson2.readUTF();
                    toPerson1.writeUTF(passage2);

                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

思考后將HandleChat類中對兩個客戶端的接收發(fā)送消息處理放在兩個線程中,就可以實現兩個客戶端自由通信。

            new Thread(() -> {
                while (true) {
                    try {
                        String passage2 = fromPerson2.readUTF();
                        toPerson1.writeUTF(passage2);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }


            }).start();


            new Thread(() -> {
                while (true) {
                    try {
                        String passage1 = fromPerson1.readUTF();
                        toPerson2.writeUTF(passage1);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();

二.Socket

1.同樣的編寫一個客戶端界面

客戶端界面

        BorderPane pane = new BorderPane();
        pane.setPadding(new Insets(5));
        pane.setStyle("-fx-border-color: green");
        pane.setLeft(new Label("Enter a radius: "));

        TextField tf = new TextField();
        tf.setAlignment(Pos.BASELINE_RIGHT);
        pane.setCenter(tf);

        BorderPane mainPane = new BorderPane();
        TextArea ta = new TextArea();
        mainPane.setCenter(new ScrollPane(ta));
        mainPane.setTop(pane);

        Scene scene = new Scene(mainPane,450,200);
        primaryStage.setTitle("Client");
        primaryStage.setScene(scene);
        primaryStage.show();

2.創(chuàng)建Socket連接客戶端并獲取輸入輸出流

        try {
//            創(chuàng)建一個連接服務器端的Socket
            Socket socket = new Socket("localhost",8000);
//            獲得輸入輸出流
            toServer = new DataOutputStream(socket.getOutputStream());
            fromServer = new DataInputStream(socket.getInputStream());

        } catch (IOException e) {
            e.printStackTrace();
        }

3.添加編輯框監(jiān)聽處理消息發(fā)送

//        編輯框事件監(jiān)聽
        tf.setOnAction(e ->{
            String passage = tf.getText().trim();
            tf.clear();
            try {
                toServer.writeUTF(passage);
                toServer.flush();
                ta.appendText("Me "  + ": " + passage + "\n");
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        });

4.創(chuàng)建新線程從服務器上接收消息

//        新線程從服務器讀取信息
        new Thread(() -> {
            while (true) {
                try {
                    String passage = fromServer.readUTF();
                    ta.appendText("He : " + passage + "\n");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

三.測試

簡單實現

四.總結

1.原理流程

原理圖

2.不足之處

只是簡單實現了靜態(tài)兩客戶端聊天的功能,并且只能夠第一個鏈接上的用戶先發(fā)送消息,且一人發(fā)送消息后只能等待接收另一個人的消息后才能再次發(fā)送消息。之后的時間希望能加以改進。

到此這篇關于Java使用Socket簡單通訊詳解的文章就介紹到這了,更多相關Java使用Socket簡單通訊內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • idea 離線安裝lombok插件的方法步驟(圖文)

    idea 離線安裝lombok插件的方法步驟(圖文)

    這篇文章主要介紹了idea 離線安裝lombok插件的方法步驟(圖文),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Java中對象的克隆詳解

    Java中對象的克隆詳解

    這篇文章主要介紹了Java中對象的克隆詳解,Java中對象的復制分為淺復制與深復制的不同之處就在于深復制還會復制對象的引用對象,需要的朋友可以參考下
    2023-08-08
  • SpringBoot中隨機鹽值+雙重SHA256加密實戰(zhàn)

    SpringBoot中隨機鹽值+雙重SHA256加密實戰(zhàn)

    本文主要介紹了SpringBoot中隨機鹽值+雙重SHA256加密實戰(zhàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07
  • 微信企業(yè)號 根據錯誤碼返回錯誤信息類封裝

    微信企業(yè)號 根據錯誤碼返回錯誤信息類封裝

    這篇文章主要介紹了微信企業(yè)號 根據錯誤碼返回錯誤信息類封裝的相關資料,需要的朋友可以參考下
    2016-10-10
  • mybatis plus in方法使用說明

    mybatis plus in方法使用說明

    這篇文章主要介紹了mybatis plus in方法使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • SpringCloud實現基于RabbitMQ消息隊列的詳細步驟

    SpringCloud實現基于RabbitMQ消息隊列的詳細步驟

    在Spring Cloud框架中,我們可以利用RabbitMQ實現強大而可靠的消息隊列系統(tǒng),本篇將詳細介紹如何在Spring Cloud項目中集成RabbitMQ,并創(chuàng)建一個簡單的消息隊列,感興趣的朋友一起看看吧
    2024-03-03
  • SpringBoot 利用thymeleaf自定義錯誤頁面

    SpringBoot 利用thymeleaf自定義錯誤頁面

    這篇文章主要介紹了SpringBoot 利用thymeleaf自定義錯誤頁面,幫助大家更好的理解和使用springboot 框架,感興趣的朋友可以了解下
    2020-11-11
  • SpringBoot前后端傳輸加密設計實現方案

    SpringBoot前后端傳輸加密設計實現方案

    這篇文章主要給大家介紹了關于SpringBoot前后端傳輸加密設計實現方案的相關資料,包括數據加密方案、解密傳輸數據實現方案和響應數據加密實現方案,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-11-11
  • Java并發(fā)(Runnable+Thread)實現硬盤文件搜索功能

    Java并發(fā)(Runnable+Thread)實現硬盤文件搜索功能

    這篇文章主要介紹了Java并發(fā)(Runnable+Thread)實現硬盤文件搜索,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Java之CountDownLatch原理全面解析

    Java之CountDownLatch原理全面解析

    這篇文章主要介紹了Java之CountDownLatch原理解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10

最新評論

石柱| 丹阳市| 岑巩县| 永平县| 宁强县| 建瓯市| 永吉县| 中西区| 绵竹市| 扎兰屯市| 佛教| 怀集县| 黄山市| 扎囊县| 韶关市| 奇台县| 鹿泉市| 上犹县| 施甸县| 城固县| 泸定县| 武穴市| 自治县| 巴马| 建平县| 胶南市| 三门峡市| 龙陵县| 山东省| 资中县| 永康市| 临夏县| 壤塘县| 廊坊市| 芮城县| 延安市| 封开县| 鸡泽县| 龙海市| 弥渡县| 大田县|