程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java中的DatagramPacket與DatagramSocket的初步

Java中的DatagramPacket與DatagramSocket的初步

編輯:關於JAVA

1.基本概念:

a.DatagramPacket與DatagramSocket位於java.net包中

b.DatagramPacket表示存放數據的數據報,DatagramSocket表示接受或發送 數據報的套接字

c.由這兩個類所有構成的網絡鏈接是基於UDP協議,是一種不可靠的協議。

之所以不可靠是因為發送方不負責數據是否發送成功,接收方收到數據時也 不會向發送方反饋成功消息,容易導致信息的丟失。

但是這種協議卻是快捷的,比如CS(半條命)游戲就是基於UDP協議,否則我們 估計要玩一次游戲後就會把機子砸了,所以我們可以看到游戲有時會失幀。

2.使用方法:

要建立基於UDP協議的鏈接,我們應該先建立套接字 <DatagramSocket>(即發送站或接收站),之後通過套接字發送或接受數據 <DatagramPacket>。

我們先了解一下DatagramSocket和DatagramPacket類

DatagramSocket類:

構造方法:

DatagramSocket():

表示創建一個默認的套接字,並綁定到本地地址和一個隨機的端口號

DatagramSocket(int port):

與上面不同的是,綁定到特定端口號,其它不變

DatagramSocket(int port, InetAddress iad):

表示創建一個套接字,綁定到特定的端口號及指定地址

DatagramSocket(SocketAddress sad);

表示創建一個套接字,綁定到特定的套接字地址

小提示:所謂的本地地址我們可以這樣來理解,我們通過“控制面板-本地連 接-支持”中可以看到一個IP地址,這就是本地的IP地址,也暫且理解為本地地 址。

基本方法:

close():

關閉套接字

recevie(DatagramPacket dp):

接受數據報

send(DatagramPacket dp):

發送數據報

這裡觸及了數據報,下面介紹數據報:

DatagramPacket類:

構造方法:(只列出主要的)

接受類型:

DatagramPacket(byte[] buf, int length):

用來接受長度為length的buf數據(即數據存於字節數組buf中)

發送類型:

DatagramPacket(byte[] buf, int length, InetAddress address, int port);

將length長的buf數據發送到指定的地址的端口號處

DatagramPacket(byte[] buf, int length, SocketAddress address);

將length長的buf數據發送到指定的套接字地址處

有上面可知,我們發送數據時構造的數據報應該是發送類型的,而接受數據 報時應該是接受類型的

開始書寫代碼

代碼意圖:

1.一個接收方,一個發送方

2.當接收方收到發送方發送的消息後,打印發送的消息及發送方的地址和端 口號,之後向發送反饋一條信息“接受方:我收到了!”

3.發送方打印出接收方反饋的消息

詳細思路見代碼:

接收方:Getter.java

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketAddress;
public class Getter {
  public static void main(String[] args) {
   try {
    //確定接受方的IP和端口號,IP地址為本地機器地址
    InetAddress ip = InetAddress.getLocalHost();
    int port = 8888;

    //創建接收方的套接字,並制定端口號和IP地址
    DatagramSocket getSocket = new DatagramSocket (port,ip);

    //確定數據報接受的數據的數組大小
    byte[] buf = new byte[1024];

    //創建接受類型的數據報,數據將存儲在buf中
    DatagramPacket getPacket = new DatagramPacket (buf,buf.length);

    //通過套接字接收數據
    getSocket.receive(getPacket);

    //解析發送方傳遞的消息,並打印
    String getMes = new String(buf,0,getPacket.getLength());
    System.out.println("對方發送的消息:"+getMes);

    //通過數據報得到發送方的IP和端口號,並打印
    InetAddress sendIP = getPacket.getAddress();
    int sendPort = getPacket.getPort();
    System.out.println("對方的IP地址是:"+sendIP.getHostAddress ());
    System.out.println("對方的端口號是:"+sendPort);

    //通過數據報得到發送方的套接字地址
    SocketAddress sendAddress = getPacket.getSocketAddress ();

    //確定要反饋發送方的消息內容,並轉換為字節數組
    String feedback = "接收方說:我收到了!";
    byte[] backBuf = feedback.getBytes();

    //創建發送類型的數據報
    DatagramPacket sendPacket = new DatagramPacket (backBuf,backBuf.length,sendAddress);

    //通過套接字發送數據
    getSocket.send(sendPacket);

    //關閉套接字
    getSocket.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
}

發送方: Sender.java

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Sender {
  public static void main(String[] args) {
   try {
    //創建發送方的套接字,IP默認為本地,端口號隨機
    DatagramSocket sendSocket = new DatagramSocket();

    //確定要發送的消息:
    String mes = "你好!接收方!";

    //由於數據報的數據是以字符數組傳的形式存儲的,所以傳轉數據
    byte[] buf = mes.getBytes();

    //確定發送方的IP地址及端口號,地址為本地機器地址
    int port = 8888;
    InetAddress ip = InetAddress.getLocalHost();

    //創建發送類型的數據報:
    DatagramPacket sendPacket = new DatagramPacket (buf,buf.length,ip,port);

    //通過套接字發送數據:
    sendSocket.send(sendPacket);

    //確定接受反饋數據的緩沖存儲器,即存儲數據的字節數組
    byte[] getBuf = new byte[1024];

    //創建接受類型的數據報
    DatagramPacket getPacket = new DatagramPacket (getBuf,getBuf.length);

    //通過套接字接受數據
    sendSocket.receive(getPacket);

    //解析反饋的消息,並打印
    String backMes = new String(getBuf,0,getPacket.getLength ());
    System.out.println("接受方返回的消息:"+backMes);

    //關閉套接字
    sendSocket.close();
   } catch (Exception e) {
    e.printStackTrace();
   }

  }
}

測試已通過

先啟動接收方,然後啟動發送方即可

本文出自 “博遠至靜” 博客,請務必保留此出處 http://sunspot.blog.51cto.com/372554/130313

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved