java 之UDP編程


大白話:每一台電腦都有自己的ip地址,向指定的ip地址發數據,數據就發送到了指定的電腦。UDP通信只是一種通信方式而已,其特點就不多說。有了ip地址數據就能發送到指定的電腦了,但是呢!我把數據發送到電腦了,電腦中的哪個程序接收呢。不知道親們知不知道,其實每一個網絡軟件都有自己的通信端口,像qq,酷狗音樂的下載端口等等。現在知道了吧,向指定的ip地址和指定的端口發數據,才能發送到指定的程序上(當然是我們自己做的程序)。

我們要做兩個程序發送端和接收端,先做發送端吧

java提供了專門用於UDP通信的類DatagramSocket;該類有DatagramSocket(int port)的構造方法---可以設定該程序通信的的端口(就像上面說的有ip了還需要端口,這是設定該程序的通信端口);該類提供了發送數據包的方法send(DatagramPacket p),接收數據包的方法receive(DatagramPacket p)

 那么DatagramSocket sendDatagramSocket = new DatagramSocket(10000);

      sendDatagramSocket .send(DatagramPacket p);這兩句就完成了,第一句設定了發送端的通信端口,第二句,發送數據

就缺一點發送到哪里!!往下看

為什么叫數據包呢!上面不是說了,要想通信成功必須向指定的ip地址和指定的端口發數據,發送的時候數據被打包了,里面包含了要發送到的ip地址,端口,和想發的數據(被打包了),注意send(DatagramPacket p)里面的DatagramPacket p,你查一下java的中文api幫助文檔就會知道DatagramPacket是一個類,他有一個構造方法DatagramPacket(byte[] buf, int length, InetAddress address, int port) 文檔中的解釋----構造數據報包,用來將長度為 length 的包發送到指定主機(指定ip地址)上的指定端口號;第一個參數byte[] buf發送的數據,類型為byte[],第二個參數int length,發送數據的長度,第三個InetAddress address發送的ip地址,類型為InetAddress ,第四個端口號。

好那么我先寫一個數據String string = "yangfengwu";然后轉化一下byte[] by = string.getBytes();意思是轉化成字符數組

相當於byte[] by ={'y','a','n','g','f','e','n','g','w','u'};不要嫌麻煩,這樣寫好處大大的有,如果做界面開發,文本框中我們所傳的數據都是字符串類型的!!

好接着DatagramPacket sendPscket = new DatagramPacket(by, by.length,InetAddress.getByName("192.168.32.1"),8080);

好說一下這個InetAddress.getByName("192.168.32.1")。InetAddress是一個java中的類,他就是專門操作ip的,列如

InetAddress i = InetAddress.getLocalHost();

System.out.println(i.toString());這兩句就可以打印出本機的名稱和ip地址

我們用getByName(String host)該方法的作用----在給定主機名的情況下確定主機的 IP 地址

主機名可以是機器名(如 "java.sun.com"),也可以是其 IP 地址的文本表示形式。如果提供字面值 IP 地址,則僅檢查地址格式的有效性。 

InetAddress ip = InetAddress.getByName("192.168.32.1");

DatagramPacket sendPscket = new DatagramPacket(by, by.length, ip ,8080);
sendDatagramSocket .send(DatagramPacket p);     發送  sendDatagramSocket .send(sendPscket );

下面是完整的發送端程序

package server;

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

public class Server_test {
public static void main(String[] str)
{
try
{
//創建DatagramSocket 對象,並指定該程序的通信端口為10000
DatagramSocket sendDatagramSocket = new DatagramSocket(10000);
//確定要發送的消息
String string = "yangfengwu";
//轉成字符數組類型
byte[] by = string.getBytes();
//確定要發送的地址
//InetAddress ip = InetAddress.getLocalHost();//如果是自己電腦測試可以這樣得到本機地址,也可以自己查自己的ip地址

//InetAddress ip = InetAddress.getByName("192.168.32.1");

//確定要發送的端口
int port = 8080;
//創建發送類型的數據包,這個數據包包含了要發往的ip地址和端口
DatagramPacket sendPscket = new DatagramPacket(by, by.length,InetAddress.getByName("192.168.32.1"),port);
//通過DatagramSocket 的send方法發送數據
sendDatagramSocket.send(sendPscket);
//創建接收緩沖區
byte[] bt = new byte[1024];
//創建接收類型的數據包

//DatagramPacket(byte[] buf, int length)構造 DatagramPacket,用來接收長度為 length 的數據包

DatagramPacket receivePacket = new DatagramPacket(bt, bt.length);
//通過DatagramSocket 的receive方法發送數據
sendDatagramSocket.receive(receivePacket);
//打印---數據包
String daString = new
String(receivePacket.getData(),0,receivePacket.getLength());//getData()方法是返回數據緩沖區
System.out.println(daString);
//關閉接收
sendDatagramSocket.close();
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}

下面是完整的接收端程序

 

package client;

 

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

 

public class Client_test {
public static void main(String[] str)
{
try
{
//確定端口
int port = 8080;
//創建DatagramSocket 對象,並指定該程序的通信端口為8080
DatagramSocket receiveSocket = new DatagramSocket(port);
while(true)
{
//創建接收緩沖區
byte[] by = new byte[1024];
//創建接收數據包
DatagramPacket receivePacket = new DatagramPacket(by, by.length);
//接收數據
receiveSocket.receive(receivePacket);
//解析消息並打印數據
String string =new String(receivePacket.getData(),0,receivePacket.getLength());
System.out.println(string);
//通過數據包也可以解析ip、和端口,打印
InetAddress ipAddress = receivePacket.getAddress();
int receivePort = receivePacket.getPort();
System.out.println(ipAddress);
System.out.println(receivePort);
//發送數據
String aaString = "123";
byte[] bb = aaString.getBytes();
//創建發送類型的數據包
DatagramPacket sendPscket = new DatagramPacket(bb, bb.length,InetAddress.getByName("192.168.32.1"), 10000);
receiveSocket.send(sendPscket);
}

//receiveSocket.close();
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}

 


免責聲明!

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



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