TCP/IP編程

TCP/IP參考模型

TCP/IP參考模型是首先由ARPANET所使用的網(wǎng)絡(luò)體系結(jié)構(gòu)。這個(gè)體系結(jié)構(gòu)在它的兩個(gè)主要協(xié)議出現(xiàn)以后被稱為T(mén)CP/IP參考模型(TCP/IP Reference Model)。這一網(wǎng)絡(luò)協(xié)議共分為四層:網(wǎng)絡(luò)訪問(wèn)層、互聯(lián)網(wǎng)層、傳輸層和應(yīng)用層。如下圖:


14ce36d3d539b6005574d31eea50352ac75cb7e5.jpg

TCP簡(jiǎn)介

TCP(Transmission Control Protocol 傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,由IETF的RFC 793定義。在簡(jiǎn)化的計(jì)算機(jī)網(wǎng)絡(luò)OSI模型中,它完成第四層傳輸層所指定的功能,用戶數(shù)據(jù)報(bào)協(xié)議(UDP)是同一層內(nèi) 另一個(gè)重要的傳輸協(xié)議。在因特網(wǎng)協(xié)議族(Internet protocol suite)中,TCP層是位于IP層之上,應(yīng)用層之下的中間層。不同主機(jī)的應(yīng)用層之間經(jīng)常需要可靠的、像管道一樣的連接,但是IP層不提供這樣的流機(jī)制,而是提供不可靠的包交換。

基于Socket的TCP編程

TCP通信中包含服務(wù)端和客戶端,下面分別講述。

服務(wù)端

第一步 創(chuàng)建ServerSocket實(shí)例;
第二步 調(diào)用ServerSocket的accept()方法,等待客戶端連接;
第三步 客戶端連接上服務(wù)端之后,數(shù)據(jù)讀寫(xiě)。

下面貼上示例代碼:

public class Server extends Base {
    private ServerSocket mServerSocket;
    private Socket mSocket;

    public Server(BaseListener listener) {
        super(listener);
    }

    public void start() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    mServerSocket = new ServerSocket(8090);

                    mSocket = mServerSocket.accept();

                    mHandler.sendMsgConnected();

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

    public void stop() {
        if (mServerSocket != null) {
            try {
                mServerSocket.close();
                mServerSocket = null;
                mHandler.sendMsgDisconnected();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private void recv() {
        if (mSocket == null) {
            return;
        }

        try {
            InputStream is = mSocket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));

            int i = 0;
            String content;
            while ((content = reader.readLine()) != null) {
                mHandler.sendMsgRecv(content);

                send("hello world:" + (i++));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public boolean send(@NonNull String content) {
        if (mSocket == null || !mSocket.isConnected()) {
            return false;
        }

        try {
            OutputStream os = mSocket.getOutputStream();
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os));
            writer.write(content + "\n");
            writer.flush();
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
}
客戶端

第一步 創(chuàng)建Socket實(shí)例;
第二步 連接上服務(wù)端之后,讀寫(xiě)數(shù)據(jù)。

下面貼上示例代碼:

public class Client extends Base {
    private Socket mSocket;

    public Client(BaseListener listener) {
        super(listener);
    }

    public void start() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                if (mSocket != null) {
                    try {
                        mSocket.close();
                        mHandler.sendMsgDisconnected();
                    } catch (IOException e) {
                        e.printStackTrace();
                        return;
                    }
                }

                try {
                    mSocket = new Socket("127.0.0.1", 8090);

                    mHandler.sendMsgConnected();

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

    public void stop() {
        if (mSocket != null) {
            try {
                mSocket.close();
                mSocket = null;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private void read() {
        if (mSocket == null || !mSocket.isConnected()) {
            return;
        }

        try {
            InputStream is = mSocket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));

            String content;
            while ((content = reader.readLine()) != null) {
                mHandler.sendMsgRecv(content);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public boolean send(@NonNull String content) {
        if (mSocket == null || !mSocket.isConnected()) {
            return false;
        }

        try {
            OutputStream os = mSocket.getOutputStream();
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os));
            writer.write(content + "\n");
            writer.flush();
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容