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

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

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

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

          ???? IP 地址和 Port (端口號)

          ▼本地回路的 IP 地址: 127.0.0.1

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

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

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

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

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

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

          協(xié)議類型

          IP

          目標 IP

          源端口

          目標端口

          幀序號

          幀數(shù)據(jù)

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

          Socket

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

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

          ???? Socket 是應(yīng)用程序中創(chuàng)建,通過一種綁定機制與驅(qū)動程序建立關(guān)系,告訴自己所對應(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ù)器(專用于和客戶端進行數(shù)據(jù)傳輸?shù)模┖涂蛻舳?/span>

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

          ???? DatagramSocket

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

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

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

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

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

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

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

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

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

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

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

          ???? DatagramPacket

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

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

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

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

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

          ???? getPort ()
          ??????????
          返回某臺遠程主機的端口號,此數(shù)據(jù)報將要發(fā)往該主機或者是從該主機接收到的。

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

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

          ???? InetAddress

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

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

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

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

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

          ???? 最簡單的 UDP 程序

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

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

          ???? start 命令來打開新命令行窗口的好處。

          ???? 解決發(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 中國";
          ???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) 評論(0)  編輯  收藏 所屬分類: 學(xué)習(xí)筆記

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

          導(dǎo)航

          統(tǒng)計

          公告

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

          常用鏈接

          留言簿(1)

          隨筆檔案

          文章分類

          文章檔案

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

          最新隨筆

          搜索

          積分與排名

          最新評論

          主站蜘蛛池模板: 光泽县| 太仓市| 孟村| 青田县| 舒兰市| 黔西县| 上杭县| 临江市| 深水埗区| 石林| 双峰县| 江安县| 洛浦县| 扶风县| 昌都县| 安康市| 始兴县| 谢通门县| 温泉县| 北京市| 拜城县| 大足县| 济源市| 灵宝市| 左云县| 泸水县| 广德县| 白城市| 元阳县| 南通市| 奉节县| 容城县| 石首市| 尼木县| 永嘉县| 利川市| 石柱| 榆树市| 宿松县| 玉山县| 紫阳县|