網絡編程的基礎知識
- 網絡協議與TCP/IP
- IP地址和Port(端口號)
- 本地迴路的IP地址:127.0.0.1
- 端口號的範圍爲0---65535之間,0----1023之間的端口數是用於一些知名的網絡服務和應用
- UDP與TCP
TCP,傳輸控制協議,是面向連接的通信協議
UDP,用戶數據報協議,是無連接通信協議
Socket
- Socket是網絡驅動層提供給應用程序編程的接口和一種機制
- 可以吧Socket比喻成是一個港口碼頭。應用程序只要把貨物放到港口碼頭上,就算完成了貨物的運送。應用程序只需等待貨物到達碼頭後,將貨物取走
- Socket在應用程序中創建,通過一種綁定機制與驅動程序建立關係,告訴自己所對應的IP和Port。
Java中的網絡編程類
- 位於java.net包中
- DatagramSocket類用於UDP通信
- ServerSocket類用於TCp通信的服務器端
- Socket類用於TCP通信的服務器和客戶端
UDP網絡程序
- DatagramSocket類
- DatagramPacket類
- InetAddress類
- 最簡單得UDP程序
- 用UDP編寫網絡聊天程序
DatagramSocket類
- 構造函數
- close方法
- send(DatagramPacket p)方法
- receive(DatagramPacket p)方法
DatagramPacket類
如果把DatagramSocket比作創建的港口碼頭,那麼DatagramPacket就是發送和接收數據的集裝箱。
- 構造函數
- getInetAddress和getPort方法
- getData和getLength方法
InetAddress類
- InetAddress是計算機IP地址的一個類,而在日常應用中的計算機地址是用“192.168.0.1”、"www.it315.org"等字符串格式來表示的。
- getByName方法
- getHostAddress方法
最簡單得UDP程序
- 字符串與字符數組之間的雙向轉換
- UDP接收程序必須先啓動運行,才能接受UDP發送程序發送的數據
- 用start命令來打開新命令行窗口的好處
- 解決發送中文字符串的問題。
package blackhouse.net;
import java.io.IOException;
import java.net.*;
public class UDPSender
{
public static void main(String[] args) throws Exception
{
DatagramSocket ds = new DatagramSocket();// 由系統自己分配
String strInfo = "hello www.315.org";
ds.send(new DatagramPacket(strInfo.getBytes(), strInfo.length(),
InetAddress.getByName("192.168.0.10"), 3000));
ds.close();
}
}
package blackhouse.net;
import java.io.IOException;
import java.net.*;
public class UDPRecv
{
public static void main(String[] args) throws Exception
{
DatagramSocket ds = new DatagramSocket(3000);
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, 1024);
ds.receive(dp);
String strInfo = new String(dp.getData(), 0, dp.getLength());
System.out.println(strInfo + " form "
+ dp.getAddress().getHostAddress() + ":" + dp.getPort());
ds.close();
}
}
如果你傳送的是中文字符會接受不到,此時只要將
ds.send(new DatagramPacket(strInfo.getBytes(), strInfo.length(),
InetAddress.getByName("192.168.0.10"), 3000));
的發送長度該爲strInfo.getBytes().length即可。