文章目錄
- 1.IP地址和Port(連接埠號碼)
- 2.TCP和UDP
- 3.Socket
- 4.Java中的網路編程類
- 現在看下如何編寫UDP網路程式
首先是一些基礎知識:
1.IP地址和Port(連接埠號碼)
原生IP地址:172.0.0.1
連接埠號碼的範圍為0~65535之間(2個位元組),0~1023是用於知名網路服務和應用,所以最好不要用0~1023這些連接埠號碼
2.TCP和UDP
TCP:傳輸控制通訊協定(Transmission Control Protocol)連線導向的通訊協定
UDP:使用者資料包通訊協定(User Datagram Protocol)不需連線的通訊協定
3.Socket
Socket是網路驅動層提供給應用程式編程的介面和一種機制
可以把Socket比作是一個碼頭,應用程式將貨物運送到碼頭,就完成了貨物的運送。在另一邊,應用程式只需等貨物到達碼頭後將貨物取走就可以了。
Socket在應用程式中建立,通過一種綁定機制與驅動程式建立關係,並告知對應的IP和連接埠
4.Java中的網路編程類
位於java.net包中
DatagramSocket類用於UDP通訊
ServerSocket類用於TCP通訊的伺服器端
Socket類用於TCP通訊的伺服器和用戶端
現在看下如何編寫UDP網路程式 DatagramSocket類
構造方法
----public DatagramSocket() (用於先發送的時候不用指定連接埠號碼,會自動選擇一個沒有用過的連接埠號碼)
----public DatagramSocket(int port) (如果要接受資料,那就必須指定一個明確的連接埠號碼)
----public DatagramSocket(int port,InetAddress laddr) (如果一個電腦上有多個IP地址的話,那就還需指定一個明確的IP地址……)
----close方法(釋放掉DatagramSocket的資源之後,連接埠號碼可以重新被其他網路資源所使用)
----send(DatagramPacket p)方法(用於發送UDP資料包)
----receive(DatagramPacket p)方法(用於接受UDP資料包)
DatagramPacket類
如果把DatagramSocket比作是碼頭,那麼DatagramPacket可以看作是發送和接受資料的集裝箱
構造方法
----public DatagramPacket(byte[] buff,int length) (buff代表緩衝區,length代表緩衝區的大小,在接受資料時使用,不用指定IP地址和連接埠)
----public DatagramPacket(byte[] buff,int length,InetAddress address,int port) (address和port代表目標電腦的IP地址和連接埠,在發送資料時使用)
----getAddress,getPort,getData,getLength方法
InetAddress類
InetAddress是一個用於表示電腦IP地址的一個類
----getByName() 靜態方法,返回執行個體
----getHostAddress() 返回IP地址字串,形如“192.168.0.1”
最簡單的UDP程式
字串與位元組數組之間的雙向轉換
UDP接受程式必須先啟動才能接受到UDP發送程式所發送的內容
解決發送中文字串的問題
發送程式:
1 import java.net.DatagramPacket;
2 import java.net.DatagramSocket;
3 import java.net.InetAddress;
4
5 public class UdpSend {
6 public static void main(String[] args) throws Exception {
7 DatagramSocket ds=new DatagramSocket();
8 String info="Hello World!";
9 ds.send(new DatagramPacket(info.getBytes(),info.length(),InetAddress.getByName("115.173.172.98"),3000));
10 ds.close();
11 }
12 }
接收程式:
1 import java.net.DatagramPacket;
2 import java.net.DatagramSocket;
3
4 public class UdpRecv {
5 public static void main(String[] args) throws Exception {
6 DatagramSocket ds=new DatagramSocket(3000);
7 DatagramPacket dp=new DatagramPacket(new byte[1024],1024);
8 ds.receive(dp);
9 System.out.println(new String(dp.getData(),0,dp.getLength()));
10 System.out.println("from:"+dp.getAddress().getHostAddress()+":"+dp.getPort());
11 ds.close();
12 }
13 }
以上程式只能用來傳送英文字元,如果要傳送中文的話,需把發送程式中的info.length()改成info.getBytes().length,因為中文佔兩個位元組。