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

計(jì)算機(jī)網(wǎng)絡(luò)--網(wǎng)絡(luò)編程(1)

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

簡(jiǎn)單認(rèn)識(shí)一下傳輸層中的UDP和TCP:

TCP:有鏈接,可靠傳輸,面向字節(jié)流,全雙工

UDP:無(wú)連接,不可靠傳輸,面向數(shù)據(jù)報(bào),全雙工


有鏈接類似于打電話,通了就是有鏈接。沒(méi)通就一直在等待。

無(wú)連接類似于發(fā)短信,只管發(fā),不管到。


可靠傳輸就是保證信息傳輸?shù)目煽啃?。就好比打電話時(shí),你會(huì)詢問(wèn)對(duì)方在嗎,對(duì)方回復(fù)你,你在發(fā)送重要數(shù)據(jù)給對(duì)方。不可靠傳輸,就好比發(fā)短信。假設(shè)對(duì)方開(kāi)啟了飛行模式,你短信依然能發(fā),但是對(duì)方收不收得到,你并不關(guān)心也不會(huì)詢問(wèn)。


字節(jié)流:能按需所取,比如100個(gè)字節(jié),可以一個(gè)字節(jié)一個(gè)字節(jié)取100次,也能5個(gè)字節(jié)5個(gè)字節(jié)的讀20次。

數(shù)據(jù)報(bào):固定的字節(jié)數(shù)據(jù)構(gòu)成一個(gè)數(shù)據(jù)報(bào),一次只能讀取發(fā)送一個(gè)數(shù)據(jù)報(bào)。


全雙工就是雙向通信。既能發(fā)送也能接收的意思。


簡(jiǎn)單介紹了TCP,UDP的一些特性,下面我們來(lái)看Java中兩個(gè)重要的網(wǎng)絡(luò)編程的類。

DatagramSocket API 使用這個(gè)類來(lái)表示一個(gè)對(duì)象,在操作系統(tǒng)中,把這個(gè)socket對(duì)象也是當(dāng)成一個(gè)文件來(lái)處理。一個(gè)socket對(duì)象,就可以和另外一臺(tái)主機(jī)進(jìn)行通信了。如果要和多個(gè)不同的主機(jī)進(jìn)行通信,就得創(chuàng)建多個(gè)socket。

DatagramSocket這個(gè)類提供了兩個(gè)構(gòu)造方法:

計(jì)算機(jī)網(wǎng)絡(luò)--網(wǎng)絡(luò)編程(1)

一個(gè)是無(wú)參構(gòu)造方法,相當(dāng)于只是創(chuàng)建了一個(gè)socket,另外一個(gè)需要傳入一個(gè)端口號(hào)。?此時(shí)就是讓當(dāng)前的socket對(duì)象和這個(gè)指定的端口,關(guān)聯(lián)起來(lái)。無(wú)參構(gòu)造也會(huì)分配一個(gè)端口號(hào),不過(guò)是系統(tǒng)自動(dòng)分配空閑的端口號(hào)。


計(jì)算機(jī)網(wǎng)絡(luò)--網(wǎng)絡(luò)編程(1)

?這兩個(gè)方法的參數(shù)是一個(gè)DatagaramPacket.這也是一個(gè)類,先來(lái)介紹下:

DatagramPacket API ?類表示UDP中傳輸?shù)囊粋€(gè)報(bào)文。發(fā)送方法就是把這個(gè)創(chuàng)建好的報(bào)文對(duì)象發(fā)送出去。接收方法的參數(shù)是一個(gè)空的對(duì)象,在receive的內(nèi)部會(huì)對(duì)參數(shù)的這個(gè)空對(duì)象進(jìn)行內(nèi)容的填充。

計(jì)算機(jī)網(wǎng)絡(luò)--網(wǎng)絡(luò)編程(1)

用于釋放資源的。


DatagramPacket這個(gè)類也提供了2個(gè)構(gòu)造方法:

DatagramPacket(byte[] buf, int length)
DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)

?第一個(gè)構(gòu)造方法相當(dāng)于設(shè)置好了一個(gè)緩沖區(qū)。

第二個(gè)構(gòu)造方法既構(gòu)造了一個(gè)緩沖區(qū)又構(gòu)造了一個(gè)地址。


基于這兩個(gè)API,構(gòu)造一個(gè)最簡(jiǎn)單的UDP客戶端服務(wù)器程序。

?服務(wù)器端的代碼:

package network;
//Udp回顯的服務(wù)器

import javax.imageio.IIOException;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;

public class UdpEchoServer {
    //網(wǎng)絡(luò)編程的本質(zhì)是要操作網(wǎng)卡
    //網(wǎng)卡不好直接操作,因此操作系統(tǒng)把socket這樣的文件抽象成了網(wǎng)卡
    //因此進(jìn)行網(wǎng)絡(luò)通信,勢(shì)必先有一個(gè)socket對(duì)象。
    private DatagramSocket socket=null;
    //對(duì)于服務(wù)器來(lái)說(shuō),創(chuàng)建socket對(duì)象的同時(shí),要讓他綁定上一個(gè)具體的端口號(hào)
    public UdpEchoServer(int port) throws SocketException {
        socket =new DatagramSocket(port);
    }
    public void start() throws IOException {
        System.out.println("服務(wù)器啟動(dòng)??!");
        while (true){
            //并不知道有多少個(gè)客戶端想建立鏈接,因此寫(xiě)個(gè)循環(huán)
            //只要有客戶端過(guò)來(lái),就可以提供服務(wù)
            //1.讀取客戶端發(fā)來(lái)的請(qǐng)求是啥
            //receive方法,需要一個(gè)空白DatagramPacket對(duì)象,交給receive來(lái)進(jìn)行填充。填充的數(shù)據(jù)來(lái)自于網(wǎng)卡
            DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);
            socket.receive(requestPacket);
            //此時(shí)這個(gè)DatagramPacket是一個(gè)特殊的對(duì)象,并不方便直接處理,可以把這里包含的數(shù)據(jù)拿出來(lái),構(gòu)成一個(gè)字符串
            String request=new String(requestPacket.getData(),0,requestPacket.getLength());
            //2.根據(jù)請(qǐng)求計(jì)算響應(yīng),由于此處是回顯服務(wù)器,響應(yīng)和請(qǐng)求相同。
            String response=process(request);
            //3.把回顯寫(xiě)回到客戶端,send參數(shù)也是DatagramPacket 需要把這個(gè)Packet對(duì)象構(gòu)造好
            DatagramPacket responsePacket =new DatagramPacket(response.getBytes(),response.getBytes().length,
                    requestPacket.getSocketAddress());
            socket.send(responsePacket);
            //4.打印請(qǐng)求響應(yīng)的處理中間結(jié)果
            System.out.printf("[%s:%d] req: %s; resp:%s\n",requestPacket.getAddress().toString(),requestPacket.getPort(),
                    request,response);


        }

    }
    //這個(gè)方法表示根據(jù)請(qǐng)求計(jì)算響應(yīng)
    public String process(String request){
        return request;


    }

    public static void main(String[] args) throws IOException {
       UdpEchoServer server=new UdpEchoServer(9090);
          server.start();

    }

}

這里我們用while循環(huán)實(shí)現(xiàn)了一直等待客戶端發(fā)送請(qǐng)求這么一個(gè)過(guò)程。假設(shè)客戶端不停的發(fā)送請(qǐng)求,并且請(qǐng)求的頻率非???。我這個(gè)服務(wù)器是否就忙不過(guò)來(lái)處理了呢?這個(gè)情況是很可能出現(xiàn)的。那么解決的方法就是高并發(fā)執(zhí)行。好比我開(kāi)了一家餐館,生意不好的時(shí)候,我一個(gè)人綽綽有余。但是生意非常好。我一個(gè)人忙不過(guò)來(lái),這個(gè)時(shí)候我雇了2個(gè)人來(lái)幫忙。這就是高并發(fā)的原理。那么高并發(fā)是如何實(shí)現(xiàn)呢。那就是通過(guò)多線程實(shí)現(xiàn)。一個(gè)核心一個(gè)線程的并發(fā)執(zhí)行。效率就會(huì)高很多。但是硬件設(shè)施終有上限。那么通過(guò)加機(jī)器也就就解決這個(gè)硬件問(wèn)題了。


客戶端的代碼:

package network;

import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

//Udp回顯客戶端
public class UdpEchoClient {
    private DatagramSocket socket=null;
    private String serverIp=null;

    private int serverPort=0;
    public UdpEchoClient (String serverIp,int serverPort) throws SocketException {
        socket =new DatagramSocket();
        this.serverIp=serverIp;
        this.serverPort=serverPort;


    }
    public void start()throws IOException {
        System.out.println("客戶端啟動(dòng)!");
        Scanner scanner=new Scanner(System.in);
        while (true) {
            //1.從控制臺(tái)讀取要發(fā)送的數(shù)據(jù)
            System.out.print("> ");
            String request =scanner.next();
            if(request.equals("exit")){
                System.out.println("goodbye");
                break;
            }
            //2.構(gòu)造成UDP請(qǐng)求,并發(fā)送,構(gòu)造這個(gè)Packet的時(shí)候,需要傳入serverIp和port,此處的IP地址是需要一個(gè)32位的整數(shù)形式
            //而上述的IP是一個(gè)字符串,所以需要進(jìn)行轉(zhuǎn)換
            DatagramPacket requestPacket =new DatagramPacket(request.getBytes(),request.getBytes().length,
                    InetAddress.getByName(serverIp),serverPort);
            socket.send(requestPacket);
            //3.讀取服務(wù)器的UDP請(qǐng)求,并解析
            DatagramPacket responsePacket =new DatagramPacket(new byte[4096],4096);
            socket.receive(responsePacket);
            String response =new String(responsePacket.getData(),0,responsePacket.getLength());
            //4.解析結(jié)果顯示出來(lái)
            System.out.println(response);
        }
    }

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

    }
}

首先啟動(dòng)我們的服務(wù)器:

計(jì)算機(jī)網(wǎng)絡(luò)--網(wǎng)絡(luò)編程(1)

就會(huì)進(jìn)入等待請(qǐng)求的狀態(tài)。

再啟動(dòng)服務(wù)器:

計(jì)算機(jī)網(wǎng)絡(luò)--網(wǎng)絡(luò)編程(1)?我們輸入一個(gè)hello;

計(jì)算機(jī)網(wǎng)絡(luò)--網(wǎng)絡(luò)編程(1)

?服務(wù)器就會(huì)給我們回一個(gè)hello。我們?cè)倏捶?wù)器那邊:

計(jì)算機(jī)網(wǎng)絡(luò)--網(wǎng)絡(luò)編程(1)

收到了客戶端的的IP地址端口號(hào)。以上就是實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的回顯服務(wù)器和客戶端。

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-508785.html

到了這里,關(guān)于計(jì)算機(jī)網(wǎng)絡(luò)--網(wǎng)絡(luò)編程(1)的文章就介紹完了。如果您還想了解更多內(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)文章

  • 計(jì)算機(jī)網(wǎng)絡(luò)---網(wǎng)絡(luò)編程套接字(一)

    計(jì)算機(jī)網(wǎng)絡(luò)---網(wǎng)絡(luò)編程套接字(一)

    ? 計(jì)算機(jī)網(wǎng)絡(luò)—網(wǎng)絡(luò)編程套接字之UDP數(shù)據(jù)報(bào)套接字編程 作者介紹: ??作者:偷偷敲代碼的青花瓷????? ??作者的Gitee:代碼倉(cāng)庫(kù) ??系列文章推薦:計(jì)算機(jī)網(wǎng)絡(luò) ——網(wǎng)絡(luò)原理之初識(shí) ??我和大家一樣都是熱愛(ài)編程?,很高興能在此和大家分享知識(shí),希望在分享知識(shí)的同時(shí),能和大

    2023年04月09日
    瀏覽(79)
  • 【計(jì)算機(jī)網(wǎng)絡(luò)】網(wǎng)絡(luò)編程套接字(一)

    【計(jì)算機(jī)網(wǎng)絡(luò)】網(wǎng)絡(luò)編程套接字(一)

    目錄 1.預(yù)備知識(shí) 1.1.理解源IP地址和目的IP地址 1.2.認(rèn)識(shí)端口號(hào) 1.2.1.理解\\\"端口號(hào)\\\"和\\\"進(jìn)程ID\\\" 1.2.2.理解源端口號(hào)和目的端口號(hào) 1.3.認(rèn)識(shí)TCP/UDP協(xié)議 1.3.1.TCP協(xié)議 1.3.2.UDP協(xié)議 1.4.網(wǎng)絡(luò)字節(jié)序 網(wǎng)絡(luò)字節(jié)序和主機(jī)字節(jié)序的轉(zhuǎn)換 2.socket編程接口 2.1.sockaddr結(jié)構(gòu) struct sockaddr_in 的具體結(jié)構(gòu): 2.

    2024年02月08日
    瀏覽(34)
  • 【計(jì)算機(jī)網(wǎng)絡(luò)】網(wǎng)絡(luò)編程套接字(二)

    【計(jì)算機(jī)網(wǎng)絡(luò)】網(wǎng)絡(luò)編程套接字(二)

    簡(jiǎn)單TCP服務(wù)器實(shí)現(xiàn) 我們將會(huì)使用到的頭文件放在 comm.h 文件中 創(chuàng)建套接字 創(chuàng)建過(guò)程和UDP服務(wù)器幾乎完全一樣,除了使用的是TCP服務(wù)器使用的是流式服務(wù)(SOCK_STREAM),UDP使用的是數(shù)據(jù)包服務(wù)(SOCK_DGRAM) 服務(wù)器綁定 綁定的過(guò)程和UDP服務(wù)器也是相同的,可以看著復(fù)習(xí)一下 定義好 st

    2024年02月13日
    瀏覽(35)
  • 【計(jì)算機(jī)網(wǎng)絡(luò)】Socket編程

    【計(jì)算機(jī)網(wǎng)絡(luò)】Socket編程

    IP地址:公網(wǎng)IP,用于唯一標(biāo)識(shí)互聯(lián)網(wǎng)中的一臺(tái)主機(jī) 源IP,目的IP:對(duì)于一個(gè)報(bào)文來(lái)講,從哪來(lái),到哪去。 源IP指將數(shù)據(jù)發(fā)送過(guò)來(lái)的IP地址,目的IP指將數(shù)據(jù)發(fā)送給下一個(gè)設(shè)備的IP地址(mac地址的變化) 意義: 指導(dǎo)一個(gè)報(bào)文該如何進(jìn)行路徑選擇,目的IP是讓我們根據(jù)目標(biāo)進(jìn)行路徑選

    2024年02月08日
    瀏覽(29)
  • 【計(jì)算機(jī)網(wǎng)絡(luò)】socket編程基礎(chǔ)

    【計(jì)算機(jī)網(wǎng)絡(luò)】socket編程基礎(chǔ)

    因特網(wǎng)上的每臺(tái)計(jì)算機(jī)都有一個(gè)唯一的IP地址,如果一臺(tái)主機(jī)上的數(shù)據(jù)要傳輸?shù)搅硪慌_(tái)主機(jī),那么對(duì)端主機(jī)的IP地址就應(yīng)該作為該數(shù)據(jù)傳輸時(shí)的目的IP地址。但僅僅知道目的IP地址是不夠的,當(dāng)對(duì)端主機(jī)收到數(shù)據(jù)后,對(duì)端還需要對(duì)該主機(jī)作出相應(yīng),因此對(duì)端主機(jī)也需要發(fā)送數(shù)據(jù)

    2024年02月15日
    瀏覽(37)
  • 計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)與JAVA網(wǎng)絡(luò)編程URL編程-----JAVA入門基礎(chǔ)教程-----計(jì)算機(jī)網(wǎng)絡(luò)經(jīng)典

    import org.junit.jupiter.api.Test; import java.io.*; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class URLTest { public static void main(String[] args) { //URL:統(tǒng)一資源定位符(種子),一個(gè)URL就定位著互聯(lián)網(wǎng)上某個(gè)資源的地址 //http:應(yīng)用層協(xié)議,IP地址,端口號(hào),資源地址,參數(shù)

    2024年02月15日
    瀏覽(99)
  • 計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)與JAVA網(wǎng)絡(luò)編程UDP編程-----JAVA入門基礎(chǔ)教程-----計(jì)算機(jī)網(wǎng)絡(luò)經(jīng)典

    import org.junit.jupiter.api.Test; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.*; public class UDP { public static void main(String[] args) { DatagramSocket datagramSocket = null; try { datagramSocket = new DatagramSocket(); InetAddress inetAddress = InetAddress.getByName(\\\"127.0.0.1\\\"); int port = 9090; byte[] byte

    2024年02月15日
    瀏覽(36)
  • 09.計(jì)算機(jī)網(wǎng)絡(luò)——套接字編程

    09.計(jì)算機(jī)網(wǎng)絡(luò)——套接字編程

    ? 內(nèi)存中的多字節(jié)數(shù)據(jù)相對(duì)于內(nèi)存地址有大端和小端之分,磁盤文件中的多字節(jié)數(shù)據(jù)相對(duì)于文件中的偏移地址也有大端小端之分,網(wǎng)絡(luò)數(shù)據(jù)流同樣有大端小端之分。 ? TCP/IP協(xié)議規(guī)定,網(wǎng)絡(luò)數(shù)據(jù)流應(yīng)采用 大端字節(jié)序 ,即低地址高字節(jié)。不管這臺(tái)主機(jī)是大端機(jī)還是小端機(jī), 都會(huì)

    2024年02月16日
    瀏覽(42)
  • 【計(jì)算機(jī)網(wǎng)絡(luò)】網(wǎng)絡(luò)編程接口 Socket API 解讀(3)

    ?????????Socket 是網(wǎng)絡(luò)協(xié)議棧暴露給編程人員的 API,相比復(fù)雜的計(jì)算機(jī)網(wǎng)絡(luò)協(xié)議,API 對(duì)關(guān)鍵操作和配置數(shù)據(jù)進(jìn)行了抽象,簡(jiǎn)化了程序編程。 ? ? ? ? 本文講述的 socket 內(nèi)容源自 Linux man。本文主要對(duì)各 API 進(jìn)行詳細(xì)介紹,從而更好的理解 socket 編程。 poll()????????? ?遵

    2024年02月09日
    瀏覽(26)
  • 【計(jì)算機(jī)網(wǎng)絡(luò)】網(wǎng)絡(luò)編程接口 Socket API 解讀(5)

    ?????????Socket 是網(wǎng)絡(luò)協(xié)議棧暴露給編程人員的 API,相比復(fù)雜的計(jì)算機(jī)網(wǎng)絡(luò)協(xié)議,API 對(duì)關(guān)鍵操作和配置數(shù)據(jù)進(jìn)行了抽象,簡(jiǎn)化了程序編程。 ? ? ? ? 本文講述的 socket 內(nèi)容源自 Linux man。本文主要對(duì)各 API 進(jìn)行詳細(xì)介紹,從而更好的理解 socket 編程。 connect()?????????

    2024年02月08日
    瀏覽(34)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包