Java study 1:The note of studying Socket which based UDP
-
UDP concept:
UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。(from baike)
- UDP program:
因爲UDP協議是一種無連接的協議,所以
(1)、每次發送數據並不需要綁定,只需要使用DatagramPacket()構造好對應的數據包就可以了;
(2)、沒有像TCP一樣的ServerSocket 與Socket之分,雙方都用DatagramPacket初始化;
(3)、發送接收用send(數據包),receive(數據包)
下面上代碼:
*UDP並無Server與Client之分,但是代碼一個發送一個接受就起了這名字(這並不重要~逃)
*發送成功之後雙方就建立了一個鏈接(虛),可以互發數據
1 import java.io.IOException; 2 import java.net.DatagramPacket; 3 import java.net.DatagramSocket; 4 import java.net.SocketException; 5 6 public class UdpServer { 7 public static void main(String[] args) { 8 DatagramSocket dgs = null; 9 try { 10 dgs=new DatagramSocket(8888); 11 //receive 12 byte[] buf=new byte[256]; 13 int length=256; 14 DatagramPacket dgp=new DatagramPacket(buf, length); 15 dgs.receive(dgp); 16 System.out.println("receive from client:"+new String(buf, 0, length)); 17 18 //send 19 String str="yeah i have receivered~"; 20 System.out.println(dgp.getAddress());//use last time's packet to get the address 21 System.out.println(dgp.getPort()); 22 DatagramPacket dgp_send=new DatagramPacket(str.getBytes(),str.length(), dgp.getAddress(), dgp.getPort()); 23 dgs.send(dgp_send); 24 dgs.close(); 25 } catch (SocketException e) { 26 e.printStackTrace(); 27 } catch (IOException e) { 28 e.printStackTrace(); 29 }finally{ 30 dgs.close(); 31 } 32 } 33 }
1 import java.net.DatagramPacket; 2 import java.net.DatagramSocket; 3 import java.net.InetAddress; 4 5 public class UdpClient { 6 public static void main(String[] args) { 7 DatagramSocket dgs = null; 8 try { 9 dgs=new DatagramSocket(); 10 //send->server 11 String str="so dirty haha~"; 12 DatagramPacket dgp_send=new DatagramPacket(str.getBytes(),0,str.length(),InetAddress.getByName("localhost"),8888); 13 dgs.send(dgp_send); 14 //receive from server 15 byte[] buf=new byte[256]; 16 DatagramPacket dgp2_receive=new DatagramPacket(buf, 256); 17 dgs.receive(dgp2_receive); 18 System.out.println("receive from server:"+new String(buf,0,256)); 19 dgs.close(); 20 21 22 } catch (Exception e) { 23 System.out.println("error:"+e); 24 } 25 } 26 }
p.s.I:Server 的 send 部分使用之前用來接收數據的包dgp來取得發送者的address以及port,然後再用新的DatagramPacket來發送數據
p.s.II:DatagramPacket的搆造函數中,byte[]用來放數據,length用來放長度,程序簡單所以數字亂寫的(ha