第九講 網(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í)筆記