国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【網(wǎng)絡(luò)編程】TCP Socket編程

這篇具有很好參考價(jià)值的文章主要介紹了【網(wǎng)絡(luò)編程】TCP Socket編程。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

流套接字: 使用傳輸層TCP協(xié)議
TCP: 即Transmission Control Protocol(傳輸控制協(xié)議),傳輸層協(xié)議。
TCP的特點(diǎn):

  1. 有連接
  2. 可靠傳輸
  3. 面向字節(jié)流
  4. 有接收緩沖區(qū),也有發(fā)送緩沖區(qū)
  5. 大小不限

1. ServerSocket

ServerSocket 是創(chuàng)建TCP服務(wù)端Socket的API。

注意: ServerSocket 只能用于 服務(wù)器端。

構(gòu)造方法:

方法簽名 方法說(shuō)明
ServerSocket(int port) 創(chuàng)建一個(gè)服務(wù)端流套接字Socket,并綁定到指定端口

方法:

方法簽名 方法說(shuō)明
Socket accept() 開(kāi)始監(jiān)聽(tīng)指定端口(創(chuàng)建時(shí)綁定的端口),有客戶端連接后,返回一個(gè)服務(wù)端Socket對(duì)象,并基于該Socket建立與客戶端的連接,否則阻塞等待
void close() 關(guān)閉此套接字

2. Socket

Socket 是客戶端Socket,或服務(wù)端中接收到客戶端建立連接(accept方法)的請(qǐng)求后,返回的服務(wù)端Socket。

構(gòu)造方法:

方法簽名 方法說(shuō)明
Socket(String host, int port) 創(chuàng)建一個(gè)客戶端流套接字Socket,并與對(duì)應(yīng)IP的主機(jī)上,對(duì)應(yīng)端口的進(jìn)程建立連接

注意:這里面的 host 和 port 是要連接的服務(wù)器的 IP 地址和端口號(hào)。

方法:

方法簽名 方法說(shuō)明
InetAddress getInetAddress() 返回套接字所連接的地址
InputStream getInputStream() 返回此套接字的輸入流
OutputStream getOutputStream() 返回此套接字的輸出流

3. TCP的長(zhǎng)短連接

TCP發(fā)送數(shù)據(jù)時(shí),需要先建立連接,什么時(shí)候關(guān)閉連接就決定是短連接還是長(zhǎng)連接:

短連接: 每次接收到數(shù)據(jù)并返回響應(yīng)后,都關(guān)閉連接,即是短連接。也就是說(shuō),短連接只能一次收數(shù)據(jù)。
長(zhǎng)連接: 不關(guān)閉連接,一直保持連接狀態(tài),雙方不停的收發(fā)數(shù)據(jù),即是長(zhǎng)連接。也就是說(shuō),長(zhǎng)連接可以多次收發(fā)數(shù)據(jù)。

兩者區(qū)別如下:

  1. 建立連接、關(guān)閉連接的耗時(shí):短連接每次請(qǐng)求、響應(yīng)都需要建立連接,關(guān)閉連接;而長(zhǎng)連接只需要第一次建立連接,之后的請(qǐng)求、響應(yīng)都可以直接傳輸。相對(duì)來(lái)說(shuō)建立連接,關(guān)閉連接也是要耗時(shí)的,長(zhǎng)連接效率更高。
  2. 主動(dòng)發(fā)送請(qǐng)求不同:短連接一般是客戶端主動(dòng)向服務(wù)端發(fā)送請(qǐng)求;而長(zhǎng)連接可以是客戶端主動(dòng)發(fā)送請(qǐng)求,也可以是服務(wù)端主動(dòng)發(fā)。
  3. 兩者的使用場(chǎng)景有不同:短連接適用于客戶端請(qǐng)求頻率不高的場(chǎng)景,如瀏覽網(wǎng)頁(yè)等。長(zhǎng)連接適用于客戶端與服務(wù)端通信頻繁的場(chǎng)景,如聊天室,實(shí)時(shí)游戲等。

4. Socket 通信模型

tcp socket,網(wǎng)絡(luò)編程,網(wǎng)絡(luò),tcp/ip,服務(wù)器

5. 代碼示例:TCP 回顯服務(wù)器

服務(wù)器代碼:

class TcpEchoServer {
    public ServerSocket serverSocket;//專門(mén)用來(lái)接受請(qǐng)求并建立鏈接
    public Socket clientSocket;//專門(mén)用來(lái)處理請(qǐng)求
    public TcpEchoServer(int port) throws IOException {
        this.serverSocket=new ServerSocket(port);
    }

    public void start() throws IOException {
        System.out.println("服務(wù)器啟動(dòng)!");
        //也可以利用線程池
        ExecutorService threadsPool= Executors.newCachedThreadPool();
        while(true){
            //接受請(qǐng)求
            clientSocket=serverSocket.accept();
//            //利用多線程才能讓服務(wù)器同時(shí)處理多個(gè)客戶端的請(qǐng)求
//            Thread t=new Thread(()->{
//                //建立鏈接并處理請(qǐng)求
//                try {
//                    createConnection(clientSocket);
//                } catch (IOException e) {
//                    throw new RuntimeException(e);
//                }
//            });
//            t.start();
            //創(chuàng)建線程池相對(duì)于每次創(chuàng)建一個(gè)線程來(lái)說(shuō)效率更高一些
            threadsPool.submit(()->{
                try {
                    createConnection(clientSocket);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            });
        }
    }

    public void createConnection(Socket clientSocket) throws IOException {
        System.out.printf("[%s:%d]建立鏈接成功\n",clientSocket.getInetAddress().toString(),clientSocket.getPort());
        //三個(gè)步驟
        //1.讀取客戶端請(qǐng)求(根據(jù)打開(kāi)的文件流確定了讀取的是客戶端發(fā)來(lái)的請(qǐng)求)
        //這里針對(duì)TCP的讀寫(xiě)和對(duì)于文件的讀寫(xiě)是一摸一樣的
        //利用socket構(gòu)造文件流
        try(InputStream inputStream=clientSocket.getInputStream()){//注意打開(kāi)的流
            //直接利用scanner讀取(利用原生的InputStream也是可以的,但Scanner更方便)
            Scanner scanner=new Scanner(inputStream);
            try(OutputStream outputStream=clientSocket.getOutputStream()){//注意打開(kāi)的流
                while(true){
                    
                    if(!scanner.hasNext()){
                        System.out.printf("[%s:%d]斷開(kāi)鏈接\n",clientSocket.getInetAddress().toString(),clientSocket.getPort());
                        break;
                    }
                    //讀取請(qǐng)求(TCP以字符流進(jìn)行傳輸)
                    // 讀到空白符/ 空格/換行才會(huì)停止
                    String request=scanner.next();
                    //2.根據(jù)請(qǐng)求計(jì)算響應(yīng)
                    String response=process(request);
                    //3.返回響應(yīng)(根據(jù)打開(kāi)的文件流決定了是往客戶端返回請(qǐng)求)
                    //為了方便用PrintWriter對(duì)OutputStream進(jìn)行包裹
                    PrintWriter printWriter=new PrintWriter(outputStream);
                    // 因?yàn)槭褂?next,讀到空白符/ 空格/換行才會(huì)停止,所以須使用 println 
                    printWriter.println(response);
                    printWriter.flush();
                    System.out.printf("[%d][req:%s resp:%s]\n",clientSocket.getPort(),request,response);
                }
            }
        }finally {
            clientSocket.close();//記得及時(shí)關(guān)閉
        }
    }

    public String process(String request){
        return request;
    }

    public static void main(String[] args) throws IOException {
        TcpEchoServer tcpEchoServer=new TcpEchoServer(9090);
        tcpEchoServer.start();
    }
}

客戶端代碼:

class TcpEchoClient {
    public Socket client;
    //TCP中客戶端構(gòu)造函數(shù)的ip和port指的是要鏈接的服務(wù)器的IP和port
    public TcpEchoClient(String serverIp, int serverPort) throws IOException {
        this.client = new Socket(serverIp, serverPort);
    }

    public void start() throws IOException {
        System.out.println("和服務(wù)器建立鏈接成功");
        Scanner scanner = new Scanner(System.in);
        //這里針對(duì)TCP的讀寫(xiě)和對(duì)于文件的讀寫(xiě)是一摸一樣的
        //利用socket構(gòu)造文件流
        try (InputStream inputStream = client.getInputStream()) {
            try (OutputStream outputStream = client.getOutputStream()) {
                //接收從控制臺(tái)輸入的字符串
                while (true) {
                    System.out.println("->");
                    String request = scanner.next();
                    //構(gòu)造請(qǐng)求并發(fā)送請(qǐng)求(PrintWriter和Scanner對(duì)應(yīng))//注意文件流
                    PrintWriter printWriter = new PrintWriter(outputStream);
                    // 因?yàn)槭褂?next,讀到空白符/ 空格/換行才會(huì)停止,所以須使用 println 
                    printWriter.println(request);
                    printWriter.flush();//如果不及時(shí)刷新,服務(wù)器可能不能及時(shí)接收到數(shù)據(jù)
                    //接收響應(yīng)
                    Scanner respScanner = new Scanner(inputStream);
                    String response = respScanner.next();
                    //顯示到控制臺(tái)上
                    System.out.printf("[req:%s  resp:%s]\n", request, response);
                }
            }
        }
    }

    public static void main(String[] args) throws IOException {
        TcpEchoClient tcpEchoClient = new TcpEchoClient("127.0.0.1", 9090);
        tcpEchoClient.start();
    }
}

注意:當(dāng)然要先啟動(dòng)服務(wù)器再啟動(dòng)客戶端!

好啦! 以上就是對(duì) TCP Socket編程的講解,希望能幫到你 !
評(píng)論區(qū)歡迎指正 !
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-733310.html

到了這里,關(guān)于【網(wǎng)絡(luò)編程】TCP Socket編程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 網(wǎng)絡(luò)編程3——TCP Socket實(shí)現(xiàn)的客戶端服務(wù)器通信完整代碼(詳細(xì)注釋幫你快速理解)

    網(wǎng)絡(luò)編程3——TCP Socket實(shí)現(xiàn)的客戶端服務(wù)器通信完整代碼(詳細(xì)注釋幫你快速理解)

    本人是一個(gè)剛剛上路的IT新兵,菜鳥(niǎo)!分享一點(diǎn)自己的見(jiàn)解,如果有錯(cuò)誤的地方歡迎各位大佬蒞臨指導(dǎo),如果這篇文章可以幫助到你,勞請(qǐng)大家點(diǎn)贊轉(zhuǎn)發(fā)支持一下! 今天分享的內(nèi)容是TCP流套接字實(shí)現(xiàn)的客戶端與服務(wù)器的通信,一定要理解 DatagramSocket,DatagramPacket 這兩個(gè)類的作用以及方法

    2024年02月12日
    瀏覽(76)
  • 【網(wǎng)絡(luò)編程】TCP Socket編程

    【網(wǎng)絡(luò)編程】TCP Socket編程

    流套接字: 使用傳輸層TCP協(xié)議 TCP: 即Transmission Control Protocol(傳輸控制協(xié)議),傳輸層協(xié)議。 TCP的特點(diǎn): 有連接 可靠傳輸 面向字節(jié)流 有接收緩沖區(qū),也有發(fā)送緩沖區(qū) 大小不限 ServerSocket 是 創(chuàng)建TCP服務(wù)端Socket 的API。 注意: ServerSocket 只能用于 服務(wù)器端。 構(gòu)造方法: 方法簽名

    2024年02月07日
    瀏覽(25)
  • Java【網(wǎng)絡(luò)編程2】使用 TCP 的 Socket API 實(shí)現(xiàn)客戶端服務(wù)器通信(保姆級(jí)教學(xué), 附代碼)

    Java【網(wǎng)絡(luò)編程2】使用 TCP 的 Socket API 實(shí)現(xiàn)客戶端服務(wù)器通信(保姆級(jí)教學(xué), 附代碼)

    ??各位讀者好, 我是小陳, 這是我的個(gè)人主頁(yè) ??小陳還在持續(xù)努力學(xué)習(xí)編程, 努力通過(guò)博客輸出所學(xué)知識(shí) ??如果本篇對(duì)你有幫助, 煩請(qǐng)點(diǎn)贊關(guān)注支持一波, 感激不盡 ?? 希望我的專欄能夠幫助到你: JavaSE基礎(chǔ): 基礎(chǔ)語(yǔ)法, 類和對(duì)象, 封裝繼承多態(tài), 接口, 綜合小練習(xí)圖書(shū)管理系統(tǒng)

    2024年02月05日
    瀏覽(32)
  • 網(wǎng)絡(luò)編程:TCP socket

    TCP(Transmission Control Protocol,傳輸控制協(xié)議)提供的是面向連接,可靠的字節(jié)流服務(wù)。即客戶和服務(wù)器交換數(shù)據(jù)前,必須現(xiàn)在雙方之間建立一個(gè)TCP連接,之后才能傳輸數(shù)據(jù)。并且提供超時(shí)重發(fā),丟棄重復(fù)數(shù)據(jù),檢驗(yàn)數(shù)據(jù),流量控制等功能,保證數(shù)據(jù)能從一端傳到另一端。 TCP不

    2024年02月05日
    瀏覽(23)
  • Go語(yǔ)言網(wǎng)絡(luò)編程(socket編程)TCP

    TCP協(xié)議 TCP/IP(Transmission Control Protocol/Internet Protocol) 即傳輸控制協(xié)議/網(wǎng)間協(xié)議,是一種面向連接(連接導(dǎo)向)的、可靠的、基于字節(jié)流的傳輸層(Transport layer)通信協(xié)議,因?yàn)槭敲嫦蜻B接的協(xié)議,數(shù)據(jù)像水流一樣傳輸,會(huì)存在黏包問(wèn)題。 TCP服務(wù)端 一個(gè)TCP服務(wù)端可以同時(shí)連接很

    2024年02月09日
    瀏覽(97)
  • 基于TCP的Socket網(wǎng)絡(luò)編程

    基于TCP的Socket網(wǎng)絡(luò)編程

    前言: Socket通信是基于TCP/IP協(xié)議的通信。在工作和做項(xiàng)目中應(yīng)用非常廣,下面來(lái)介紹下Socket網(wǎng)絡(luò)編程! Socket的介紹 首先,在Socket網(wǎng)絡(luò)編程中我們要了解兩個(gè)重要的東西,ip和端口號(hào),一臺(tái)擁有IP地址的主機(jī)可以提供許多服務(wù),比如Web服務(wù)、FTP服務(wù)、SMTP服務(wù)等。這些服務(wù)完全

    2024年02月11日
    瀏覽(20)
  • Go語(yǔ)言網(wǎng)絡(luò)編程(socket編程)TCP粘包

    服務(wù)端代碼如下: 客戶端代碼如下: 將上面的代碼保存后,分別編譯。先啟動(dòng)服務(wù)端再啟動(dòng)客戶端,可以看到服務(wù)端輸出結(jié)果如下: 收到client發(fā)來(lái)的數(shù)據(jù): Hello, Hello. How are you?Hello, Hello. How are you?Hello, Hello. How are you?Hello, Hello. How are you?Hello, Hello. How are you? 收到client發(fā)來(lái)的數(shù)

    2024年02月09日
    瀏覽(95)
  • 【網(wǎng)絡(luò)篇】socket編程——TCP(史上最全)

    【網(wǎng)絡(luò)篇】socket編程——TCP(史上最全)

    目錄 一、初始TCP 1.TCP協(xié)議特點(diǎn) 2.TCP頭: ?3.確認(rèn)應(yīng)答機(jī)制 4.超時(shí)重傳機(jī)制 5.流量控制 6.擁塞控制 (1)TCP 的擁塞控制方法 慢開(kāi)始 擁塞避免 快重傳 快恢復(fù) 二、建立連接——三次握手 ?三、斷開(kāi)連接——四次揮手 四、socket編程 ##客戶端API函數(shù) ##服務(wù)端API函數(shù) (1)TCP 是 面向連

    2024年02月08日
    瀏覽(24)
  • 【網(wǎng)絡(luò)通信】socket編程——TCP套接字

    【網(wǎng)絡(luò)通信】socket編程——TCP套接字

    TCP依舊使用代碼來(lái)熟悉對(duì)應(yīng)的套接字,很多接口都是在udp中使用過(guò)的 所以就不會(huì)單獨(dú)把他們拿出來(lái)作為標(biāo)題了,只會(huì)把第一次出現(xiàn)的接口作為標(biāo)題 通過(guò)TCP的套接字 ,來(lái)把數(shù)據(jù)交付給對(duì)方的應(yīng)用層,完成雙方進(jìn)程的通信 在 tcpServer.hpp 中,創(chuàng)建一個(gè)命名空間 yzq 用于封裝 在命名

    2024年02月13日
    瀏覽(101)
  • Socket編程接口API并實(shí)現(xiàn)簡(jiǎn)單的TCP網(wǎng)絡(luò)編程

    Socket編程接口API并實(shí)現(xiàn)簡(jiǎn)單的TCP網(wǎng)絡(luò)編程

    #include sys/types.h #include sys/socket.h socket()創(chuàng)建套接字,成功返回套接字的文件描述符,失敗返回-1 domain: 設(shè)置套接字的協(xié)議簇, AF_UNIX AF_INET AF_INET6 type: 設(shè)置套接字的服務(wù)類型 SOCK_STREAM SOCK_DGRAM protocol: 一般設(shè)置為 0,表示使用默認(rèn)協(xié)議 int socket(int domain, int type, int protocol); bind()將

    2024年02月13日
    瀏覽(30)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包