基於UDP的網路資料傳輸測試(Java+Android)
零、前言
1.本文不是大講特講UDP和TCP的區別,或者其流程,只是基於此作些小測試
2.完成兩個計算機、手機、計算機與手機之間的資訊資料傳輸
3.把控制檯輸出及GUI操作 以及Android展現形式
4.既然都是Java,可以讓計算機與Android端通訊,在java的控制檯上操作Android
5.java控制檯、java的GUI、Android介面都只是作為java的一種展現形式,任何一方都可以作為客戶端或服務端
1.java控制檯與控制檯測試

udp傳送與接收訊息_控制檯.png
2.java的GUI測試

udp傳送與接收訊息.png
3.java控制檯與安卓測試

udp傳送與接收訊息android.png
一、java控制檯與控制檯測試
1:updSocket服務端:資料傳送方
思路
1---建立updSocket服務。 2---提供資料,並將資料封裝到資料包中。 3---通過socket服務的傳送功能,將資料包發出去。 4---關閉資源。
public class UDPServer { public static void main(String[] args) { System.out.println("這是服務端"); try { //1: 通過DatagramSocket物件建立updSocket服務:埠8081 DatagramSocket datagramSocket = new DatagramSocket(8081); //2,確定資料,並封裝成資料包。DatagramPacket(byte[] buf, int length, InetAddress address, int port) byte[] buf = "土豆土豆,我是地瓜".getBytes(); DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.56.1"), 8080); //3,通過socket服務,將已有的資料包傳送出去。通過send方法。 datagramSocket.send(dp); //4,關閉資源。 datagramSocket.close(); } catch (Exception e) { e.printStackTrace(); } } }
2:客戶端:資料接收方
思路
1---定義udpSocket服務。通常會監聽一個埠。(給網路應用定義數字標識--便於該應用程式處理傳來資料過來) 2---定義一個數據包,因為要儲存接收到的位元組資料(資料包物件中有更多功能可以提取位元組資料中的不同資料資訊) 3---通過socket服務的receive方法將收到的資料存入已定義好的資料包中。 4---通過資料包物件的特有功能。將這些不同的資料取出。列印在控制檯上。 5---關閉資源。
class UDPClient { public static void main(String[] args) throws Exception { System.out.println("這是客戶端"); //1:建立udp socket,建立端點。 DatagramSocket ds = new DatagramSocket(8080); while (true) { //2:定義資料包。用於儲存資料。 byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length); //3:通過服務的receive方法將收到資料存入資料包中。 ds.receive(dp);//阻塞式方法。 //4:通過資料包的方法獲取其中的資料。 String ip = dp.getAddress().getHostAddress(); String data = new String(dp.getData(), 0, dp.getLength()); int port = dp.getPort(); System.out.println("來自" + ip + ":" + port + ":" + data); } //5:關閉資源 //ds.close(); } }
1.先開啟客戶端,然後程式由於ds.receive(dp);會進入等待
2.開啟服務端後,客戶端會接收到服務端資料
3.如果客戶端在其他的電腦上,對應好IP和埠,也可以列印到其他電腦上

udp傳送與接收訊息_控制檯.png
二、java的GUI測試
控制元件是通過Idea拖拽的
主要邏輯是不變的,只是在按鈕點選時進行資料的傳送文字框中的字串,關閉視窗時關閉服務
1:GUI實現服務端
public class UDPServer { private JPanel mPanel1; private JButton mButton1; private JTextField mMsg; private DatagramSocket mDatagramSocket; public UDPServer() { mDatagramSocket = null; try { //1: 通過DatagramSocket物件建立updSocket服務 mDatagramSocket = new DatagramSocket(8081); } catch (Exception e) { e.printStackTrace(); } mButton1.addActionListener(e -> { //2,確定資料,並封裝成資料包。DatagramPacket(byte[] buf, int length, InetAddress address, int port) byte[] buf = mMsg.getText().getBytes(); DatagramPacket dp = null; try { dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.56.1"), 8080); //3,通過socket服務,將已有的資料包傳送出去。通過send方法。 mDatagramSocket.send(dp); } catch (Exception e1) { e1.printStackTrace(); } }); } public void close() { //4,關閉資源。 mDatagramSocket.close(); } public static void main(String[] args) { JFrame frame = new JFrame("服務端"); frame.setSize(400, 400); frame.setLocation(300, 200); UDPServer UDPServer = new UDPServer(); frame.setContentPane(UDPServer.mPanel1); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { UDPServer.close(); } }); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }
2:GUI實現客戶端
public class UDPClient { private JPanel mPanel1; private JTextArea mTextArea1; public static void main(String[] args) { JFrame frame = new JFrame("客戶端"); frame.setSize(400, 400); frame.setLocation(300, 200); UDPClient client = new UDPClient(); frame.setContentPane(client.mPanel1); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); StringBuilder sb = new StringBuilder(); //1:建立udp socket,建立端點。 DatagramSocket ds = null; try { ds = new DatagramSocket(8080); while (true) { //2:定義資料包。用於儲存資料。 byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length); //3:通過服務的receive方法將收到資料存入資料包中。 ds.receive(dp);//阻塞式方法。 //4:通過資料包的方法獲取其中的資料。 String ip = dp.getAddress().getHostAddress(); String data = new String(dp.getData(), 0, dp.getLength()); int port = dp.getPort(); sb.append("來自" + ip + ":" + port + ":" + data+"\n"); client.mTextArea1.setText(sb.toString()); System.out.println(sb.toString()); } //5:關閉資源 //ds.close(); } catch (Exception e) { e.printStackTrace(); } } }

udp傳送與接收訊息.png
三、java控制檯與Android
在設定-->關於手機-->狀態資訊 中檢視手機的ip(此處使用wifi測試)
在服務端要寫對應的ip。

ip.png
1.服務端的java程式碼:
public class UDPServer2 { public static void main(String[] args) throws IOException { System.out.println("這是服務端"); //1: 通過DatagramSocket物件建立updSocket服務:埠8081 DatagramSocket datagramSocket = new DatagramSocket(8081); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line = null; while ((line = br.readLine()) != null) { if ("886".equals(line)) { break; } byte[] buf = line.getBytes(); //2,確定資料,並封裝成資料包。DatagramPacket(byte[] buf, int length, InetAddress address, int port) DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.10.111"), 8080); //3,通過socket服務,將已有的資料包傳送出去。通過send方法。 datagramSocket.send(dp); } //4,關閉資源。 datagramSocket.close(); } }
2.客戶端的Android程式碼
本示例並不需要網路許可權!
必須要在子執行緒接收資料,不然報異常,所以使用handler進行控制元件重新整理
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @BindView(R.id.id_tv_ip) TextView mIdTvIp; Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { String obj = (String) msg.obj; mSb.append(obj + " "); mIdTvIp.setText(mSb.toString()); } }; private StringBuffer mSb; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); mSb = new StringBuffer(); new Thread() { @Override public void run() { try { //1:建立udp socket,建立端點。 DatagramSocket ds = new DatagramSocket(8080); while (true) { //2:定義資料包。用於儲存資料。 byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length); //3:通過服務的receive方法將收到資料存入資料包中。 ds.receive(dp);//阻塞式方法。 //4:通過資料包的方法獲取其中的資料。 String data = new String(dp.getData(), 0, dp.getLength()); Message msg = Message.obtain(); msg.obj = data; mHandler.sendMessage(msg); } //5:關閉資源 //ds.close(); } catch (IOException e) { e.printStackTrace(); } } }.start(); } }

udp傳送與接收訊息android.png
如果你想要對網路傳輸有一點興趣,不妨親自試一下,用電腦控制手機或其他電腦的感覺還蠻不錯的。好了,就醬紫。
後記:捷文規範
1.本文成長記錄及勘誤表
專案原始碼 | 日期 | 備註 |
---|---|---|
V0.1--無 | 2018-10-2 | ofollow,noindex">基於UDP的網路資料傳輸測試(Java+Android) |
V0.2--無 | - | - |
2.更多關於我
筆名 | 微信 | 愛好 | |
---|---|---|---|
張風捷特烈 | 1981462002 | zdl1994328 | 語言 |
我的github | 我的簡書 | 我的CSDN | 個人網站 |
3.宣告
1----本文由張風捷特烈原創,轉載請註明
2----歡迎廣大程式設計愛好者共同交流
3----個人能力有限,如有不正之處歡迎大家批評指證,必定虛心改正
4----看到這裡,我在此感謝你的喜歡與支援