網絡應用中基本上都是TCP(Transmission Control Protocol傳輸控制協議)和UDP(User Datagram Protocol用戶數據報協議),TCP是面向連接的通信協議,UDP是無連接的通信協議.
127.0.0.1是回路地址,用於測試,相當於localhost本機地址,沒有網卡,不設DNS都可以訪問.
端口地址在0~65535之間,其中0~1023之間的端口是用於一些知名的網絡服務和應用,用戶的普通網絡應用程序應該使用1024以上的端口.
Socket連接套接字,Java分別為TCP和UDP提供了相應的類,TCP是java.net.ServerSocket(用於服務器端)和java.net.Socket(用於客戶端);UDP是java.net.DatagramSocket.
1,Java編寫UDP網絡程序
1.1,DatagramSocket
DatagramSocket有如下構造方法:
1,DatagramSocket() :構造數據報套接字並將其綁定到本地主機上任何可用的端口。
2,DatagramSocket(int port):創建數據報套接字並將其綁定到本地主機上的指定端口。
3,DatagramSocket(int port, InetAddress laddr):創建數據報套接字,將其綁定到指定的本地地址。即指定網卡發送和接收數據.
如果在創建DatagramSocket對象時,沒有指定網卡的IP 地址,在發送數據時,底層驅動程序會自動選擇一塊網卡去發送,在接收數據時,會接收所有的網卡收到的與端口一致的數據.
發送信息時,可以不指定端口號,接收信息時,要指定端口號,因為要接收指定的數據.
發送數據使用DatagramSocket.send(DatagramPacket p)方法,接收數據使用DatagramSocket.receive(DatagramPacket p)方法.
1.2,DatagramPacket
DatagramPacket類有如下構造方法:
1,DatagramPacket(byte[] buf, int length):構造 DatagramPacket,用來接收長度為length的數據包。
2,DatagramPacket(byte[] buf, int length, InetAddress address, int port):構造數據報包,用來將長度為length的包發送到指定主機上的指定端口號。
接收數據時使用第一次構造方法,發送數據時使用第二種構造方法.
1.3,InetAddress
Java中對IP地址進行包裝的類,
DatagramPacket.getAddress()可以獲取發送或接收方的IP地址.DatagramPacket.getPort()可以獲取發送或接收方的端口.
1.4,UDP程序例子
發送程序:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UdpSend {
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket();
String str = "hello , world!";
DatagramPacket dp = new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName("192.168.0.105"),3000);
ds.send(dp);
ds.close(); //關閉連接
}
}
接收程序:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
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,buf.length);
ds.receive(dp);
String str = new String(dp.getData(),0,dp.getLength());
System.out.println(str);
System.out.println("IP:" + dp.getAddress().getHostAddress() + ",PORT:" + dp.getPort());
ds.close();
}
}
測試要先運行接收程序,再運行發送程序.如果接收程序沒有接收到數據,則會一直阻塞,接收到數據後才會關閉程序.如果網絡上沒有數據發送過來,接收程序也沒有阻塞,通常都是使用了一個已經被占用的端口.