java基於UDP的socket通信

一.socket通信有2種,一種是基於tcp的可靠連接,一種是基於UDP的無連接包投遞服務連接,UDP通信中常用到的類有:DatagramSocket類和DatagramPacket類。

二.DatagramSocket類 表示用來發送和接收數據報包的套接字。

數據報套接字是包投遞服務的發送或接收點。每個在數據報套接字上發送或接收的包都是單獨編址和路由的。從一臺機器發送到另一臺機器的多個包可能選擇不同的路由,也可能按不同的順序到達。

在 DatagramSocket 上總是啓用 UDP 廣播發送。爲了接收廣播包,應該將 DatagramSocket 綁定到通配符地址。在某些實現中,將 DatagramSocket 綁定到一個更加具體的地址時廣播包也可以被接收。

主要構造方法:
DatagramSocket ()
                 構造數據報套接字並將其綁定到本地主機上任何可用的端口。
DatagramSocket (int port)
                 創建數據報套接字並將其綁定到本地主機上的指定端口。

主要方法有

void               

receive ( DatagramPacket p)
                 從此套接字接收數據報包。

void               

send ( DatagramPacket p)
                 從此套接字發送數據報包。

void                  

close ()
                 關閉此數據報套接字。

三.DatagramPacket類提供數據包的服務。
數據報包用來實現無連接包投遞服務。每條報文僅根據該包中包含的信息從一臺機器路由到另一臺機器。從一臺機器發送到另一臺機器的多個包可能選擇不同的路由,也可能按不同的順序到達。不對包投遞做出保證。

主要構造方法:
DatagramPacket (byte[] buf, int length)
                 構造 DatagramPacket ,用來接收 長度爲 length 的數據包。
DatagramPacket (byte[] buf, int length, InetAddress address, int port)
                 構造數據報包,用來將長度爲 length 的包發送到指定主機上的指定端口號。

主要方法:

int                 

getPort ()
                 返回某臺遠程主機的端口號,此數據報將要發往該主機或者是從該主機接收到的。

int                  

getLength ()
                 返回將要發送或接收到的數據的長度。

InetAddress           

getAddress ()
                 返回某臺機器的 IP 地址,此數據報將要發往該機器或者是從該機器接收到的。

四.實驗代碼:

MyReceive.java
-----------------------------------------
package udp;
import java.net.*;
public class MyReceive {

/**
         * @param args
         */
public static void main(String[] args) {
         // TODO Auto-generated method stub
         MyReceive.receive();
}

public static void receive()
{
         try{
          DatagramSocket ds=new DatagramSocket(9528);//在端口9528接收數據報包的套接字
          byte[] buf=new byte[100];
          DatagramPacket dp=new DatagramPacket(buf,100);//創建長度爲100的數據接收包
          ds.receive(dp);//套接字接受數據包
          System.out.println(new String(buf,0,dp.getLength()));
          //這裏接收完成,我們給發送者一條消息,告訴他發送成功了
          String str="message send success!";
          DatagramPacket senddp=new DatagramPacket(str.getBytes(),str.length(),
                    dp.getAddress(),dp.getPort());
          //創建發送包
          ds.send(senddp);//執行發送
          ds.close();//關閉UDP套接字
         }catch(Exception e)
         {e.printStackTrace();}
}
}

MySend.java
---------------------------------------------------------------
package udp;

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.net.*;

public class MySend {

public static void main(String[] args) {
         String str = "";
         try {
          while (str.length() < 1) {
           System.out.println("請輸入您的名字");
           str = new DataInputStream(new BufferedInputStream(System.in))
             .readLine();
          }
         } catch (Exception e) {
          e.printStackTrace();
         }
         MySend.send(str);
}

public static void send(String str)
{
         try{
          DatagramSocket ds=new DatagramSocket();
          DatagramPacket dp=new DatagramPacket(str.getBytes(),str.length(),
                   InetAddress.getByName("127.0.0.1"),
                   9528);
          ds.send(dp);
          byte[] buf=new byte[100];
          DatagramPacket recedp=new DatagramPacket(buf,100);
          ds.receive(recedp);
          System.out.println(new String(buf,0,recedp.getLength()));
          ds.close();
         }catch(Exception e)
         {e.printStackTrace();}
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章