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

如何使用Java完成Socket通信

 更新時間:2023年09月28日 17:00:51   作者:牛言牛語  
這篇文章主要介紹了如何使用Java完成Socket通信問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

使用Java完成Socket通信

用Java實現(xiàn)一個最基本的Socket_TCP編程

可以放在一個項目中,創(chuàng)建兩個Java文件

注意:

  • 先運行服務器端(SocketTCP_Server類)
  • 再運行客戶端(SocketTCP_Client類)
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
    服務器端
 */
public class SocketTCP_Server {
    public static void main(String[] args) throws Exception {
        //思路
        //1. 在本機 的9999端口監(jiān)聽, 等待連接
        //   細節(jié): 要求在本機沒有其它服務在監(jiān)聽9999
        //   細節(jié):這個 ServerSocket 可以通過 accept() 返回多個Socket[多個客戶端連接服務器的并發(fā)]
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服務器段,監(jiān)聽9999端口,等待連接");
        //2. 當沒有客戶端連接9999端口時,程序會 阻塞, 等待連接
        //   如果有客戶端連接,則會返回Socket對象,程序繼續(xù)
        Socket socket = serverSocket.accept();
        System.out.println("服務器端 socket = " + socket.getClass());
        //3. 通過socket.getInputStream() 讀取客戶端寫入到數(shù)據(jù)通道的數(shù)據(jù), 顯示
        InputStream inputStream = socket.getInputStream();
        //4. IO讀取
        byte[] buf = new byte[1024];
        int readLine = 0;
        while ((readLine = inputStream.read(buf)) != -1) {
            System.out.println(new String(buf, 0, readLine));
        }
        //5.關閉IO流和socket
        inputStream.close();
        socket.close();
        serverSocket.close();
    }
}
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
/**
 * 客戶端
 */
public class SocketTCP_Client {
    public static void main(String[] args) throws Exception {
        //1. 連接服務端 (ip , 端口)
        //解讀:連接本機的 9999端口, 如果連接成功,返回Socket對象
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        System.out.println("客戶端 socket = " + socket.getClass());
        //2. 連接上后,生成Socket, 通過socket.getOutputStream()
        //得到和 socket對象關聯(lián)的輸出流對象
        OutputStream outputStream = socket.getOutputStream();
        //3. 通過輸出流,寫入數(shù)據(jù)到 數(shù)據(jù)通道
        outputStream.write("Hello,server".getBytes());
        //4. 關閉流對象和socket, 必須關閉
        outputStream.close();
        socket.close();
        System.out.println("客戶端退出...");
    }
}

Java socket通信,用于各種無線網(wǎng)絡通信

無論是使用Wi-Fi模塊在單片機和電腦或手機之間進行數(shù)據(jù)傳輸,基本方法都是:

一臺設備建立服務端,一臺設備作為客戶端連接,連接成功后即可進行通信。

服務端的建立

Java中建立服務端,不局限于電腦才能建立,一臺手機同樣可以建立:

    /**
     * 建立服務端
     *
     * @param sp 建立服務端的通信端口
     */
    private static void StartServer(int sp) {
        try {
            serverSocket = new ServerSocket(sp);   //服務端使用ServerSocket建立
            System.out.println("Server started at:" + InetAddress.getLocalHost());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        new Thread(){
            @Override
            public void run() {
                while (SERVER_ENABLE) { //循環(huán)監(jiān)聽
                    try {
                        s = serverSocket.accept(); //在有客戶端連入之前,while循環(huán)將一直卡在這里
                        new MasterServerThread(s).start(); //客戶端連接成功后,開啟一個自定義的服務器線程
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }

服務線程  

    /**
     * 服務器主線程
     */
    private static class MasterServerThread extends Thread {
        Socket masterSocket = null; //傳入的客戶端Socket
        String socketKind = null;
        //構造方法,在實例化本Class時要求傳入客戶端的socket
        public MasterServerThread(Socket s) {
            this.masterSocket = s;
        }
        @Override
        public void run() {
            BufferedReader bre = null;
            try {
                bre = new BufferedReader(new InputStreamReader(masterSocket.getInputStream(), "utf-8"));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                while ((socketKind = bre.readLine()) != null) { //接收讀取傳輸過來的數(shù)據(jù) 
                    //根據(jù)發(fā)過來的數(shù)據(jù)是什么,決定進行指定操作        
                     if (socketKind.contains(LOGIN_REQUEST)) {//TODO 處理登陸請求操作
                           //......
                     } else if (socketKind.contains(OPERATION_OF_BINDING_DEVICE)) {//TODO 處理設備綁定
                           //......
                     }                 
                }
            } catch (Exception e) {
                //e.printStackTrace();
            }
        }
    }

客戶端的連接

/**
*    SERVER_IP : String型
*  SERVER_PORT :int型
*/
Socket socket = new Socket(SERVER_IP, SERVER_PORT); //服務端用的ServerSocket,客戶端對應的是使用Socket
ClientThread ct = new ClientThread(socket);  //同樣開啟客戶端線程,與服務器通信用
ct.start();
 

客戶端線程

    /**
     * Class : ClientThread
     * 與服務端線程class十分相像
     */
    private class ClientThread extends Thread {
        Socket cSocket;
        BufferedReader br;
        public ClientThread(Socket s) {
            this.cSocket = s;
        }
        @Override
        public void run() {
            try {
                br = new BufferedReader(new InputStreamReader(cSocket.getInputStream(), "UTF-8"));
                while ((temp = br.readLine()) != null) {
                    //Do Something...
                   }
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }

發(fā)送消息

 /**
     * 發(fā)送登陸信息
     * @param id 用戶ID
     * @param pwd 賬號密碼
     */
    private void sendLoginMsg(final String id, final String pwd) {
        new Thread() {
            @Override
            public void run() {
                try {
                    PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
                    printWriter.println(LOGIN_REQUEST + "CONNECTION_FROM_APP" + "_" + id + "$" + pwd + "&");
                    printWriter.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • java 實現(xiàn)簡單圣誕樹的示例代碼(圣誕節(jié)快樂)

    java 實現(xiàn)簡單圣誕樹的示例代碼(圣誕節(jié)快樂)

    這篇文章主要介紹了java 實現(xiàn)簡單圣誕樹的示例代碼(圣誕節(jié)快樂),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • Java中synchronized鎖升級的過程

    Java中synchronized鎖升級的過程

    本文主要介紹了Java中synchronized鎖升級的過程,synchronized相對于早期的synchronized做出了優(yōu)化,從以前的加鎖就是重量級鎖優(yōu)化成了有一個鎖升級的過,下文詳細內(nèi)容需要的小伙伴可以參考一下
    2022-05-05
  • Maven倉庫無用文件和文件夾清理的方法實現(xiàn)

    Maven倉庫無用文件和文件夾清理的方法實現(xiàn)

    這篇文章主要介紹了Maven倉庫無用文件和文件夾清理的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • 詳解Spring Boot中Controller用法

    詳解Spring Boot中Controller用法

    Controller是SpringBoot里最基本的組件,他的作用是把用戶提交來的請求通過對URL的匹配,分配個不同的接收器,再進行處理,然后向用戶返回結果。下面通過本文給大家介紹Spring Boot中Controller用法,需要的朋友參考下
    2017-05-05
  • idea2025中git的local changes找不到了的問題分析及解決方案

    idea2025中git的local changes找不到了的問題分析及解決方案

    在IDEA 2025中,LocalChanges視圖遷移至Advanced Settings下的VersionControl.Git設置,若未顯示,需檢查是否啟用GitHub插件,并在相應選項中勾選啟用,本文給大家介紹idea2025中git的local changes找不到了的問題,感興趣的朋友一起看看吧
    2025-07-07
  • logback的UNDEFINED_PROPERTY屬性源碼執(zhí)行流程解讀

    logback的UNDEFINED_PROPERTY屬性源碼執(zhí)行流程解讀

    這篇文章主要為大家介紹了logback的UNDEFINED_PROPERTY屬性源碼執(zhí)行流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • maven依賴關系中的<scope>provided</scope>使用詳解

    maven依賴關系中的<scope>provided</scope>使用詳解

    這篇文章主要介紹了maven依賴關系中的<scope>provided</scope>使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • SpringBoot 利用MultipartFile上傳本地圖片生成圖片鏈接的實現(xiàn)方法

    SpringBoot 利用MultipartFile上傳本地圖片生成圖片鏈接的實現(xiàn)方法

    這篇文章主要介紹了SpringBoot 利用MultipartFile上傳本地圖片生成圖片鏈接的實現(xiàn)方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • java實現(xiàn)優(yōu)酷視頻地址解析示例代碼分享

    java實現(xiàn)優(yōu)酷視頻地址解析示例代碼分享

    最近做了一個在線視頻的下載器,需要解析youku的視頻,獲得真正的視頻地址,現(xiàn)在把解析過程記錄下來以供參考
    2014-01-01
  • Spring中基于Java的配置@Configuration和@Bean用法詳解

    Spring中基于Java的配置@Configuration和@Bean用法詳解

    這篇文章主要介紹了Spring中基于Java的配置@Configuration和@Bean用法詳解,Spring中為了減少xml中配置,可以聲明一個配置類(例如SpringConfig)來對bean進行配置。,需要的朋友可以參考下
    2019-06-06

最新評論

洛阳市| 鲜城| 淮南市| 满洲里市| 华坪县| 洪洞县| 桃源县| 赤水市| 翁源县| 惠来县| 陆河县| 安庆市| 慈利县| 鹤庆县| 方山县| 弋阳县| 辽宁省| 电白县| 阳东县| 抚宁县| 姜堰市| 尉犁县| 灯塔市| 五华县| 昆明市| 西安市| 锦屏县| 门头沟区| 泰宁县| 泸水县| 安义县| 竹山县| 巢湖市| 霍林郭勒市| 赫章县| 正阳县| 永定县| 玉门市| 昌吉市| 依安县| 大洼县|