本篇文章介紹下基于UDP協議的Socket通信


對于Socket還不太了解的建議先看看我前面三篇文章 Socket網絡知識學習基礎 Socket通信學習實例一之建立Socket連接 Socket通信學習實例二之即時通信 Socket通信學習實例三之斷點上傳
DatagramSocket DatagramSocket有如下構造方法:
DatagramSocket() 構造數據報套接字并將其綁定到本地主機上任何可用的端口。 DatagramSocket(int port) 創建數據報套接字并將其綁定到本地主機上的指定端口。 DatagramSocket(int port, InetAddress laddr) 創建數據報套接字,將其綁定到指定的本地地址。即指定網卡發送和接收數據. 如果在創建DatagramSocket對象時,沒有指定網卡的ip 地址,在發送數據時,底層驅動程序會自動選擇一塊網卡去發送,在接收數據時,會接收所有的網卡收到的與端口一致的數據.發送信息時,可以不指定端口號,接收信息時,要指定端口號,因為要接收指定的數據.
發送數據使用DatagramSocket.send(DatagramPacket p)方法,接收數據使用DatagramSocket.receive(DatagramPacket p)方法.
DatagramPacket DatagramPacket類有如下構造方法:
DatagramPacket(byte[] buf, int length) 構造 DatagramPacket,用來接收長度為length的數據包。DatagramPacket(byte[] buf, int length, InetAddress address, int port) 構造數據報包,用來將長度為length的包發送到指定主機上的指定端口號。接收數據時使用第一次構造方法,發送數據時使用第二種構造方法.
InetAddress Java中對IP地址進行包裝的類, DatagramPacket.getAddress()可以獲取發送或接收方的IP地址.DatagramPacket.getPort()可以獲取發送或接收方的端口.
服務器端首先創建一個DatagramSocket對象,并且指點監聽的端口。接下來創建一個空的DatagramSocket對象用于接收數據(bytedata[]=newbyte[1024;]DatagramSocketpacket=newDatagramSocket(data,data.length)),使用DatagramSocket的receive方法接收客戶端發送的數據,receive()與serversocket的accepet()類似,在沒有數據進行接收的處于堵塞狀態。 客戶端也創建個DatagramSocket對象,并且指點監聽的端口。接下來創建一個InetAddress對象,這個對象類似與一個網絡的發送地址(InetAddressserveraddress=InetAddress.getByName(”172.168.1.120”)).定義要發送的一個字符串,創建一個DatagramPacket對象,并制定要講這個數據報包發送到網絡的那個地址以及端口號,最后使用DatagramSocket的對象的send()發送數據。*(Stringstr=”hello”;bytedata[]=str.getByte();DatagramPacketpacket=new DatagramPacket(data,data.length,serveraddress,4567);socket.send(packet);)
服務端代碼
public SocketUDPTest() throws IOException { /* * 接收客戶端發送的數據 */ //創建一個DatagramSocket對象,并指定監聽端口 DatagramSocket socket = new DatagramSocket(SocketTool.PORT); //創建一個byte類型的數組,用于存放接收到得數據 byte[] data = new byte[1024]; //創建數據報,用于接收客戶端發送的數據 DatagramPacket packet = new DatagramPacket(data, data.length); System.out.客戶端代碼private void sendUDPSocket() throws IOException { /* * 向服務器端發送數據 */ //定義服務器的地址、端口號 InetAddress address = InetAddress.getByName(SocketTool.HOST); int port = SocketTool.PORT; //創建要包含到數據報中的信息 byte[] sendData = "Hello Socket From UDP!".getBytes(); //創建數據報,包含要發送的數據信息 DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, port); //創建DatagramSocket對象 DatagramSocket socket = new DatagramSocket(); //向服務器端發送數據報 socket.send(sendPacket); /* * 接收服務器端響應的數據 */ //創建一個byte類型的數組,用于存放接收到得數據 byte[] receiveData = new byte[1024]; DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); //接收服務端響應的數據,此方法在接收到數據報之前會一直阻塞 socket.receive(receivePacket); //讀取服務端響應的數據 String result = new String(receiveData, 0, receivePacket.getLength()); Log.i(TAG, "3.客戶端收到服務端響應的消息:" + result); //關閉Socket socket.close(); }由于比較簡單,直接看注釋就可以,界面部分參考demo,這里不詳細分析了
完整示例: Android端代碼 JAVA端代碼
新聞熱點
疑難解答