国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Socket通信學習實例四之UDP通信

2019-11-06 09:41:10
字體:
來源:轉載
供稿:網友

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

這里寫圖片描述

這里寫圖片描述

對于Socket還不太了解的建議先看看我前面三篇文章 Socket網絡知識學習基礎 Socket通信學習實例一之建立Socket連接 Socket通信學習實例二之即時通信 Socket通信學習實例三之斷點上傳

java中的UDP網絡通信用到的類

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端代碼


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 马山县| 社会| 扎兰屯市| 微山县| 东乡| 大竹县| 永新县| 双牌县| 松滋市| 明溪县| 定陶县| 社会| 分宜县| 陇西县| 仁怀市| 思南县| 准格尔旗| 日土县| 大城县| 永泰县| 丹凤县| 南和县| 富裕县| 页游| 凌源市| 苍南县| 轮台县| 德兴市| 昔阳县| 蓝田县| 谢通门县| 图木舒克市| 武威市| 襄垣县| 盐源县| 酒泉市| 江门市| 香港| 葵青区| 贺州市| 黄陵县|