在上一篇中,使用了 java Socket+Tcp/IP 協議來實現應用程序或客戶端--服務器間的實時雙向通信,本篇中,將使用 UDP 協議來實現 Socket 的通信。
1. 關於UDP
UDP協議(用戶數據報協議)是無連接的、不可靠的、無序的,速度快,進行數據傳輸時,首先將要傳輸的數據定義成數據報(Datagram),大小限制在64k,在數據報中指明數據索要達到的Socket(主機地址和端口號),然后再將數據報發送出去,Java 對UDP 協議通信提供了兩個主要的類,DatagramPacket類:表示數據報包,DatagramSocket類:進行端到端通信的類。
2. 實現方法
2.1 服務器端
- 創建DatagramSocket,指定端口號
- 創建DatagramPacket
- 接受客戶端發送的數據信息
- 讀取數據
//服務器端,實現基於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 客戶端
- 定義發送信息
- 創建DatagramPacket,包含將要發送的信息
- 創建DatagramSocket
- 發送數據
//客戶端
//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. 注意問題
- 多線程的優先級問題:根據實際的經驗,適當的降低優先級,否側可能會有程序運行效率低的情況
- 是否關閉輸出流和輸入流:對於同一個socket,如果關閉了輸出流,則與該輸出流關聯的socket也會被關閉,所以一般不用關閉流,直接關閉socket即可
- 使用TCP通信傳輸對象,IO中序列化部分
- socket編程傳遞文件,IO流部分
參考資料:
http://www.cnblogs.com/linzheng/archive/2011/01/23/1942328.html
