首頁 > Java > java教程 > 主體

詳解java中模擬UDP傳輸的發送端與接收端實例

黄舟
發布: 2017-03-28 10:18:10
原創
1913 人瀏覽過

這篇文章主要介紹了java 中模擬UDP傳輸的發送端和接收端實例詳解的相關資料,需要的朋友可以參考下

java 中模擬UDP傳輸的發送端和接收端實例詳解

一、建立UDP傳輸的發送端

1、建立UDP的Socket服務;

2、將要傳送的資料封裝到封包中;

3、透過UDP的Socket服務將封包傳送出去;

4、關閉Socket服務。

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPSend {

 public static void main(String[] args) throws IOException {

  System.out.println("发送端启动......");

  // 1、创建UDP的Socket,使用DatagramSocket对象
  DatagramSocket ds = new DatagramSocket();

  // 2、将要发送的数据封装到数据包中
  String str = "UDP传输演示:I'm coming!";

  byte[] buf = str.getBytes(); //使用DatagramPacket将数据封装到该对象的包中

  DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.191.1"), 10000);

  // 3、通过UDP的Socket服务将数据包发送出去,使用send方法
  ds.send(dp);

  // 4、关闭Socket服务
  ds.close();
 }
}
登入後複製

二、建立UDP傳輸的接收端

1、建立UDP的Socket服務,因為要接收數據,所以必須明確一個連接埠號碼;

2、建立資料包,用於儲存接收到的數據,方便用資料包物件的方法解析這些資料;

3、使用UDP的Socket服務的receive方法接收資料並儲存到資料包;

4、透過資料包的方法解析這些資料;

5、關閉Socket服務。

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPReceive {
 public static void main(String[] args) throws IOException {

  System.out.println("接收端启动......");

  // 1、建立UDP的Socket服务
  DatagramSocket ds = new DatagramSocket(10000);

  // 2、创建数据包
  byte[] buf = new byte[1024];
  DatagramPacket dp = new DatagramPacket(buf, buf.length);

  // 3、使用接收方法将数据存储到数据包中
  ds.receive(dp); // 该方法为阻塞式的方法

  // 4、通过数据包对象的方法解析这些数据,例如:地址、端口、数据内容等
  String ip = dp.getAddress().getHostAddress();
  int port = dp.getPort();
  String text = new String(dp.getData(), 0, dp.getLength());

  System.out.println(ip + ":" + port + ":" + text);

  // 5、关闭Socket服务
  ds.close();
 }
}
登入後複製

三、優化UDP傳輸的發送端和接收端

#由於在前兩部分中,我們一次只能發送(或接收)一條訊息,然後就關閉服務啦!因此如果我們想要發送多個訊息,則需要不斷的在發送端修改發送的內容,並且還需要重新啟動伺服器,比較麻煩。為了克服以上的缺點,我們可以對其進行最佳化,即:

1、在發送端,建立BufferedReader,從鍵盤錄入內容;

2、在接收端,加入while(ture)循環,不斷的循環接收內容。

/**
*优化UDP传输的发送端
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPSend {
 public static void main(String[] args) throws IOException {

  System.out.println("发送端启动......");

  // 创建UDP的Socket,使用DatagramSocket对象
  DatagramSocket ds = new DatagramSocket();

  BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  String line = null;
  while ((line = bufr.readLine()) != null) {
   // 使用DatagramPacket将数据封装到该对象的包中
   byte[] buf = line.getBytes();
   DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.191.1"), 10000);
   // 通过UDP的Socket服务将数据包发送出去,使用send方法
   ds.send(dp);
   // 如果输入信息为over,则结束循环
   if ("over".equals(line))
    break;
  }
  // 关闭Socket服务
  ds.close();
 }
}
登入後複製
/**
*优化UDP传输的接收端
*/
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPReceive {
 public static void main(String[] args) throws IOException {

  System.out.println("接收端启动......");

  // 建立UDP的Socket服务
  DatagramSocket ds = new DatagramSocket(10000);

  while(true) {
   // 创建数据包
   byte[] buf = new byte[1024];
   DatagramPacket dp = new DatagramPacket(buf, buf.length);

   // 使用接收方法将数据存储到数据包中
   ds.receive(dp); // 该方法为阻塞式的方法

   // 通过数据包对象的方法解析这些数据,例如:地址、端口、数据内容等
   String ip = dp.getAddress().getHostAddress();

   int port = dp.getPort();
   String text = new String(dp.getData(), 0, dp.getLength());
   System.out.println(ip + ":" + port + ":" + text);
  }
 }
}
登入後複製

四、建立聊天室

根據UDP(User Datagram Protocol, 使用者資料報協定)的相關性質,我們可以進一步建立一個簡單的基於UDP傳輸協議下的聊天室,實現互動聊天的功能。

/**
*创建UDP传输下的聊天室发送端
*/
package chat;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class Send implements Runnable {

 private DatagramSocket ds;

 public Send(DatagramSocket ds) {
  this.ds = ds;
 }

 public void run() {
  try {
   BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
   String line = null;
   while ((line = bufr.readLine()) != null) {
    byte[] buf = line.getBytes();
    DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.191.255"), 10001);
    ds.send(dp);
    if ("886".equals(line))
     break;
   }
   ds.close();
  } catch (Exception e) {
   System.out.println("对不起,发生错误啦!");
  }
 }
}
登入後複製
/**
*创建UDP传输下的聊天室接收端
*/
package chat;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Rece implements Runnable {

 private DatagramSocket ds;

 public Rece(DatagramSocket ds) {
  this.ds = ds;
 }

 public void run() {
  try {
   while (true) {
    byte[] buf = new byte[1024];
    DatagramPacket dp = new DatagramPacket(buf, buf.length);
    ds.receive(dp);
    String ip = dp.getAddress().getHostAddress();
    String text = new String(dp.getData(), 0, dp.getLength());
    System.out.println(ip + ":::" + text);
    if(text.equals("886")){
     System.out.println(ip+"......退出聊天室!");
    }
   }
  } catch (Exception e) {
   System.out.println("对不起,发生错误啦!");
  }
 }
}
登入後複製
/**
*创建UDP传输下的聊天室
*/
package chat;

import java.io.IOException;
import java.net.DatagramSocket;

public class ChatRoom {
 public static void main(String[] args) throws IOException {
  DatagramSocket send = new DatagramSocket();
  DatagramSocket rece = new DatagramSocket(10001);
  new Thread(new Send(send)).start();
  new Thread(new Rece(rece)).start();
 }
}
登入後複製

以上是詳解java中模擬UDP傳輸的發送端與接收端實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!