第九講 網(wǎng)絡(luò)編程

          第九講 網(wǎng)絡(luò)編程

          ???? 網(wǎng)絡(luò)編程的基礎(chǔ)知識(shí)

          ???? 網(wǎng)絡(luò)協(xié)議與 TCP/IP

          ???? IP 地址和 Port (端口號(hào))

          ▼本地回路的 IP 地址: 127.0.0.1

          ▼端口號(hào)的范圍為 0 65535 之間, 0 1023 之間的端口數(shù)是用于一些知名的網(wǎng)絡(luò)服務(wù)和應(yīng)用。

          ???? UDP 網(wǎng)絡(luò)程序

          UDP ,用戶數(shù)據(jù)報(bào)協(xié)議( User Datagram Protocol ),是無(wú)連接通信協(xié)議。

          ???? TCP 網(wǎng)絡(luò)程序

          ???? TCP ,傳輸控制協(xié)議( Transmission Control Protocol , 是面向連接的通信協(xié)議。

          TCP UDP 的數(shù)據(jù)幀格式簡(jiǎn)單圖例:

          協(xié)議類型

          IP

          目標(biāo) IP

          源端口

          目標(biāo)端口

          幀序號(hào)

          幀數(shù)據(jù)

          ??????????????????????????????????????????????????????? 其中協(xié)議類型用于區(qū)分 TCP UDP

          Socket

          ???? Socket 是網(wǎng)絡(luò)驅(qū)動(dòng)層提供給應(yīng)用程序編程的接口和一種機(jī)制。

          ???? 可以把 Socket 比喻成是一個(gè)港口碼頭,應(yīng)用程序只要把貨物放到港口碼頭上,就算完成了貨物的運(yùn)送。應(yīng)用程序只需等待貨物到達(dá)碼頭后,將貨物取走。

          ???? Socket 是應(yīng)用程序中創(chuàng)建,通過一種綁定機(jī)制與驅(qū)動(dòng)程序建立關(guān)系,告訴自己所對(duì)應(yīng)的 IP Port

          ???? Socket 數(shù)據(jù)發(fā)送過程

          ???? Socket 數(shù)據(jù)接收過程

          Java 中的網(wǎng)絡(luò)編程類

          ???? 位于 java.net 包中

          ???? DatagramSocket 類用于 UDP 通信

          ???? ServerSocket 類用于 TCP 通信的服務(wù)器端(接受客戶端連接的)

          ???? Socket 類用于 TCP 通信的服務(wù)器(專用于和客戶端進(jìn)行數(shù)據(jù)傳輸?shù)模┖涂蛻舳?/span>

          UDP 網(wǎng)絡(luò)程序

          ???? DatagramSocket

          此類表示用來(lái)發(fā)送和接收數(shù)據(jù)報(bào)包的套接字。

          數(shù)據(jù)報(bào)套接字是包投遞服務(wù)的發(fā)送或接收點(diǎn)。每個(gè)在數(shù)據(jù)報(bào)套接字上發(fā)送或接收的包都是單獨(dú)編址和路由的。從一臺(tái)機(jī)器發(fā)送到另一臺(tái)機(jī)器的多個(gè)包可能選擇不同的路由,也可能按不同的順序到達(dá)。

          DatagramSocket 上總是啟用 UDP 廣播發(fā)送。為了接收廣播包,應(yīng)該將 DatagramSocket 綁定到通配符地址。在某些實(shí)現(xiàn)中,將 DatagramSocket 綁定到一個(gè)更加具體的地址時(shí)廣播包也可以被接收。

          示例: DatagramSocket s = new DatagramSocket(null); s.bind(new InetSocketAddress(8888)); 這等價(jià)于: DatagramSocket s = new DatagramSocket(8888); 兩個(gè)例子都能創(chuàng)建能夠在 UDP 8888 端口上接收廣播的 DatagramSocket

          ???? 構(gòu)造函數(shù)

          DatagramSocket ()
          ??????????
          構(gòu)造數(shù)據(jù)報(bào)套接字并將其綁定到本地主機(jī)上任何可用的端口。

          DatagramSocket (int ? port)
          ??????????
          創(chuàng)建數(shù)據(jù)報(bào)套接字并將其綁定到本地主機(jī)上的指定端口

          DatagramSocket (int ? port, InetAddress ? laddr)
          ??????????
          創(chuàng)建數(shù)據(jù)報(bào)套接字,將其綁定到指定的本地地址。

          ???? close ()
          ??????????
          關(guān)閉此數(shù)據(jù)報(bào)套接字。

          ???? send (DatagramPacket ? p)
          ??????????
          從此套接字發(fā)送數(shù)據(jù)報(bào)包。

          ???? receive (DatagramPacket ? p)
          ??????????
          從此套接字接收數(shù)據(jù)報(bào)包。

          ???? DatagramPacket

          如果把 DatagramSocket 比作創(chuàng)建的港口碼頭,那么 DatagramPacket 就是發(fā)送和接收數(shù)據(jù)的集裝箱。

          ???? 構(gòu)造函數(shù):

          DatagramPacket (byte[] ? buf, int ? length)
          ??????????
          構(gòu)造 DatagramPacket ,用來(lái)接收長(zhǎng)度為 length 的數(shù)據(jù)包

          DatagramPacket (byte[] ? buf, int ? length, InetAddress ? address, int ? port)
          ??????????
          構(gòu)造數(shù)據(jù)報(bào)包,用來(lái)將長(zhǎng)度為 length 的包發(fā)送到指定主機(jī)上的指定端口號(hào)。

          ???? getAddress ()
          ??????????
          返回某臺(tái)機(jī)器的 IP 地址,此數(shù)據(jù)報(bào)將要發(fā)往該機(jī)器或者是從該機(jī)器接收到的。

          ???? getPort ()
          ??????????
          返回某臺(tái)遠(yuǎn)程主機(jī)的端口號(hào),此數(shù)據(jù)報(bào)將要發(fā)往該主機(jī)或者是從該主機(jī)接收到的。

          ???? getData ()
          ??????????
          返回?cái)?shù)據(jù)緩沖區(qū)。

          ???? getLength ()
          ??????????
          返回將要發(fā)送或接收到的數(shù)據(jù)的長(zhǎng)度。

          ???? InetAddress

          ???? InetAddress 是用于表示計(jì)算機(jī) IP 地址的一個(gè)類,而在日常應(yīng)用中的計(jì)算機(jī)地址是用“ 192.168.0.1 ”、 www.it315.org 等字符串格式來(lái)表示的。

          ???? getByName (String ? host)
          ??????????
          在給定主機(jī)名的情況下確定主機(jī)的 IP 地址。

          ???? getHostAddress ()
          ??????????
          返回 IP 地址字符串(以文本表現(xiàn)形式)。

          ???? getHostName ()
          ??????????
          獲取此 IP 地址的主機(jī)名。

          ???? getLocalHost ()
          ??????????
          返回本地主機(jī)。

          ???? 最簡(jiǎn)單的 UDP 程序

          ???? 字符串與字節(jié)數(shù)組之間的雙向轉(zhuǎn)換

          ???? UDP 接收程序必須先啟動(dòng)運(yùn)行,才能接收 UDP 發(fā)送程序發(fā)送的數(shù)據(jù)。

          ???? start 命令來(lái)打開新命令行窗口的好處。

          ???? 解決發(fā)送中文字符串的問題。

          ???? UDP 編寫網(wǎng)絡(luò)聊天程序
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
          import java.net.*;
          public class UdpSend
          {
          ?
          ?/**
          ? * Method main
          ? *
          ? *
          ? * @param args
          ? *
          ? */
          ?public static void main(String[] args)
          ?{
          ??// TODO: Add your code here
          ??try
          ??{
          ???DatagramSocket ds=new DatagramSocket();
          ???/*
          ???String strInfo="hello ???ds.send(new DatagramPacket(strInfo.getBytes(),strInfo.length(),InetAddress.getByName("192.168.0.239"),2000));
          ???*/
          ???String str="hello 中國(guó)";
          ???ds.send(new DatagramPacket(str.getBytes(),str.getBytes().length,InetAddress.getByName("192.168.0.239"),2500));
          ???ds.close();
          ??}
          ??catch(Exception e)
          ??{
          ???e.printStackTrace();
          ??}
          ??
          ?}?
          }
          import java.net.*;
          public class UdpReceive
          {
          ?
          ?/**
          ? * Method main
          ? *
          ? *
          ? * @param args
          ? *
          ? */
          ?public static void main(String[] args)
          ?{
          ??// TODO: Add your code here
          ??try
          ??{
          ???DatagramSocket ds=new DatagramSocket(2500);
          ???byte []buf=new byte [1024];
          ???DatagramPacket dp=new DatagramPacket(buf,1024);
          ???ds.receive(dp);
          ???System.out.println(new String(dp.getData(),0,dp.getLength())+
          ????" from:"+" IP: "+dp.getAddress().getHostAddress()+" Port: "+dp.getPort());
          ???ds.close();
          ??}
          ??catch(Exception e)
          ??{
          ???e.printStackTrace();
          ??}
          ??
          ??
          ?}?
          }


          ????? ?

          posted on 2007-01-27 18:32 大頭劍客 閱讀(231) 評(píng)論(0)  編輯  收藏 所屬分類: 學(xué)習(xí)筆記

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導(dǎo)航

          統(tǒng)計(jì)

          公告

          寫字樓里寫字間,寫字間里程序員;
          程序人員寫程序,又拿程序換酒錢;
          酒醒只在網(wǎng)上坐,酒醉還來(lái)網(wǎng)下眠;
          酒醉酒醒日復(fù)日,網(wǎng)上網(wǎng)下年復(fù)年;
          但愿老死電腦間,不愿鞠躬老板前;
          奔馳寶馬貴者趣,公交自行程序員;
          別人笑我忒瘋癲,我笑自己命太賤;
          不見滿街漂亮妹,哪個(gè)歸得程序員.
          不管前面是地雷陣還是萬(wàn)丈深淵,
          我都將勇往直前,義無(wú)反顧,
          鞠躬盡瘁,死而后已。
          —— 朱镕基總理

          常用鏈接

          留言簿(1)

          隨筆檔案

          文章分類

          文章檔案

          學(xué)習(xí)園地

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          主站蜘蛛池模板: 金沙县| 乌拉特后旗| 祁阳县| 北票市| 龙南县| 东至县| 文山县| 徐州市| 洛川县| 巴里| 盱眙县| 伊川县| 新沂市| 静海县| 弥渡县| 白朗县| 华蓥市| 双柏县| 敦化市| 巴林左旗| 利津县| 东乡族自治县| 疏勒县| 焦作市| 谢通门县| 海宁市| 合川市| 嘉定区| 怀集县| 工布江达县| 桃园市| 财经| 景德镇市| 日喀则市| 长治县| 五华县| 鄂州市| 潢川县| 阳信县| 旌德县| 邯郸县|