利用UDP協議實現兩臺電腦之間的資訊交流
阿新 • • 發佈:2019-01-26
關於UDP:將資料及源和目的封裝成資料包中,不需要建立連線;每個資料報的大小在限制在64k內;因無連線,是不可靠協議;不需要建立連線,速度快
使用udp協議主要涉及到兩個類:DatagramSocket,DatagramPacket
DatagramSocket: 用於建立一個數據包的出口或入口,構造方法中有IP的都是用於接收方的
DatagramPacket: 用於包裝資料,構造方法中有IP的都是用於傳送方的
可以將其比作傳送包裹,DatagramSocket就是快遞公司,選擇哪一個快遞公司並不會影響包裹的傳送;而DatagramPacket則是你的包裹,上面必須寫明地址(IP)和門牌號(port:埠號).
下面的程式,兩臺電腦各執行一個,只需要將IP改為接收方的IP,埠號改為你電腦上面空餘的埠號(電腦的埠號是0--65535,1024以內是系統的,所以一般建議使用1024以外的埠號)
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; import java.util.Scanner; public class Chat { public static void main(String[] args) { DatagramSocket sendsocket = null; DatagramSocket receiceSocket = null; try { sendsocket = new DatagramSocket(); receiceSocket = new DatagramSocket(8888,InetAddress.getByName("127.0.0.1")); } catch (SocketException e) { e.printStackTrace(); } catch (UnknownHostException e) { e.printStackTrace(); } new Thread(new Send(sendsocket)).start(); new Thread(new Receive(receiceSocket)).start(); } } class Send implements Runnable{ DatagramSocket socket = null; public Send(DatagramSocket socket) { this.socket = socket; } @Override public void run() { byte[] buf = new byte[1024]; DatagramPacket packet = null; Scanner scanner = new Scanner(System.in); while(true) { String data = scanner.nextLine(); if("over".equalsIgnoreCase(data)) { break; } buf = data.getBytes(); try { //接收方的IP和埠號 packet = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 9999); socket.send(packet); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } scanner.close(); } } class Receive implements Runnable{ DatagramSocket socket; public Receive(DatagramSocket socket) { this.socket = socket; } @Override public void run() { while(true) { byte[]buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, buf.length); try { socket.receive(packet); } catch (IOException e) { e.printStackTrace(); break; } String text = new String(packet.getData(), 0, packet.getLength()); String ip = packet.getAddress().getHostAddress(); if("over".equalsIgnoreCase(text)) { break; } System.out.println(ip+" : "+text); } socket.close(); } }
-------------------------------#以下是補充內容,2018-10-16 #----------------------------------------
在傳送端,要在資料包物件中明確目的地IP及埠
DatagramSocket ds = new DatagramSocket(); byte[] by = “hello,udp”.getBytes(); DatagramPacket dp = new DatagramPacket(by,0,by.length, InetAddress.getByName(“127.0.0.1”),10000); ds.send(dp); ds.close();
在接收端,要指定監聽的埠
DatagramSocket ds = new DatagramSocket(10000);
byte[] by = new byte[1024];
DatagramPacket dp = new DatagramPacket(by,by.length);
ds.receive(dp);
String str = new String(dp.getData(),0,dp.getLength());
System.out.println(str+"--"+dp.getAddress());
ds.close();