JAVA Socket 編程學習筆記(二)


在上一篇中,使用了 java Socket+Tcp/IP  協議來實現應用程序或客戶端--服務器間的實時雙向通信,本篇中,將使用 UDP 協議來實現 Socket 的通信。

1. 關於UDP

  UDP協議(用戶數據報協議)是無連接的、不可靠的、無序的,速度快,進行數據傳輸時,首先將要傳輸的數據定義成數據報(Datagram),大小限制在64k,在數據報中指明數據索要達到的Socket(主機地址和端口號),然后再將數據報發送出去,Java 對UDP 協議通信提供了兩個主要的類,DatagramPacket類:表示數據報包,DatagramSocket類:進行端到端通信的類。

2. 實現方法

  2.1 服務器端

  1. 創建DatagramSocket,指定端口號
  2. 創建DatagramPacket
  3. 接受客戶端發送的數據信息
  4. 讀取數據
//服務器端,實現基於UDP的用戶登錄 
//1、創建服務器端DatagramSocket,指定端口 
DatagramSocket socket =new datagramSocket(10010); 
//2、創建數據報,用於接受客戶端發送的數據 
byte[] data =newbyte[1024];// 
DatagramPacket packet =newDatagramPacket(data,data.length); 
//3、接受客戶端發送的數據 
socket.receive(packet);//此方法在接受數據報之前會一致阻塞 
//4、讀取數據 
String info =newString(data,o,data.length); 
System.out.println("Hello,我是服務器,客戶端告訴我"+info);  
//========================================================= 
//向客戶端響應數據 
//1、定義客戶端的地址、端口號、數據 
InetAddress address = packet.getAddress(); 
int port = packet.getPort(); 
byte[] data2 = "歡迎您!".geyBytes(); 
//2、創建數據報,包含響應的數據信息 
DatagramPacket packet2 = new DatagramPacket(data2,data2.length,address,port); 
//3、響應客戶端 
socket.send(packet2); 
//4、關閉資源 
socket.close(); 

 2.2 客戶端

  1. 定義發送信息
  2. 創建DatagramPacket,包含將要發送的信息
  3. 創建DatagramSocket
  4. 發送數據
//客戶端 
//1、定義服務器的地址、端口號、數據 
InetAddress address =InetAddress.getByName("localhost"); 
int port =10010; 
byte[] data ="用戶名:admin;密碼:123".getBytes(); 
//2、創建數據報,包含發送的數據信息 
DatagramPacket packet = newDatagramPacket(data,data,length,address,port); 
//3、創建DatagramSocket對象 
DatagramSocket socket =newDatagramSocket(); 
//4、向服務器發送數據 
socket.send(packet); 
 
//接受服務器端響應數據 
//====================================== 
//1、創建數據報,用於接受服務器端響應數據 
byte[] data2 = new byte[1024]; 
DatagramPacket packet2 = new DatagramPacket(data2,data2.length); 
//2、接受服務器響應的數據 
socket.receive(packet2); 
String raply = new String(data2,0,packet2.getLenth()); 
System.out.println("我是客戶端,服務器說:"+reply); 
//4、關閉資源 
socket.close(); 

 3. 注意問題   

  1. 多線程的優先級問題:根據實際的經驗,適當的降低優先級,否側可能會有程序運行效率低的情況
  2. 是否關閉輸出流和輸入流:對於同一個socket,如果關閉了輸出流,則與該輸出流關聯的socket也會被關閉,所以一般不用關閉流,直接關閉socket即可
  3. 使用TCP通信傳輸對象,IO中序列化部分
  4. socket編程傳遞文件,IO流部分

 參考資料

http://www.cnblogs.com/linzheng/archive/2011/01/23/1942328.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM