Java網絡編程之UDP網絡通信

1? ? ? 網絡編程----UDPNo25

【Scanner scanner =new Scanner(System.in);

try {

DatagramSockets = newDatagramSocket(8888);

String line =scanner.nextLine();

byte[] bytes =line.getBytes();//把用戶輸入的字符串拆成字節(jié)數(shù)組

//把字節(jié)數(shù)組塞進包里,寫上對方的地址和端口

try {

DatagramPacketp = new DatagramPacket(bytes, bytes.length,

InetAddress.getByName("127.0.0.1"),9999);

s.send(p);//發(fā)送包裹

s.close();

scanner.close();

DatagramSockets = new DatagramSocket(9999);

byte[] bytes = newbyte[1024];

DatagramPacket p =new DatagramPacket(bytes, bytes.length);//準備空包

s.receive(p);//接收,空包裹被填滿

String str = newString(bytes,0,p.getLength()); //用字節(jié)數(shù)組的有效數(shù)據組裝回字符串

System.out.println(str);

s.close();

2:bytes

DatagramSocket s =new DatagramSocket(9999);

byte[] bytes = newbyte[128];//用于存放接收數(shù)據的數(shù)組

//用于存放接收數(shù)據的空數(shù)據報包,字節(jié)數(shù)組放置其中

DatagramPacket p =new DatagramPacket(bytes, bytes.length);

s.receive(p);//接收其他收發(fā)站發(fā)來的數(shù)據,阻塞方法,收到才返回

for(int i=0;i

System.out.println(bytes[i]);? //下標為0,1,2,3

}

s.close();//關閉收發(fā)站

DatagramSocket s =new DatagramSocket(8888);//在8888上建立收發(fā)站

byte[] bytes = { 1,2, 3 };//要發(fā)送的數(shù)據

//建立一個包,把要發(fā)送的數(shù)據塞進去,寫上對方的地址和端口9999

DatagramPacket p =new DatagramPacket(bytes, bytes.length,

InetAddress.getByName("127.0.0.1"),9999);

s.send(p);

s.close();//關閉收發(fā)站

UDP UserDatagram Protocol用戶數(shù)據報協(xié)議

也是傳輸層的一個協(xié)議,信息傳輸時不需要連接,不可靠,效率較高

1.1????Java進行UDP通信

Java進行UDP通信:

DatagramSocket相當于一個收發(fā)站(信息發(fā)送站)

構造方法:DatagramSocket(int port)在port端口上建立收發(fā)站

send(DatagramPacketp)發(fā)送數(shù)據報包

receive(DatagramPacketp)接受數(shù)據報包,阻塞方法,一旦收到對象發(fā)過來的包,這個DatagramPacket中的存放數(shù)據的字節(jié)數(shù)組就會自動填充對方發(fā)過來的信息

DatagramPacket數(shù)據報包,收發(fā)站要進行收發(fā)的包(信息接收站)

構造方法:

一、發(fā)送的包:

DatagramPacket(byte[]bytes,int len,InetAddress addr,int port)第一個參數(shù)表示字節(jié)數(shù)組形式的發(fā)送數(shù)據,第二個參數(shù)是包的長度,一般是字節(jié)數(shù)組的長度,第三個參數(shù)是接收方的地址,第四個參數(shù)接收方的端口)

二、接收的包:

DatagramPacket(byte[]bytes,int len)

第一個參數(shù)是存放接收數(shù)據的數(shù)組,第二個是接收數(shù)據的長度

getLength()獲取包的有效長度

InetAddress.getByName(Stringaddress)根據字符串生成一個地址對象

getAddress()獲得一個InetAddress對象,表示發(fā)送方地址,再調用這個對象的getHostAddress()獲取字符串形式的地址

int getPort()獲取端口號

1.2????網絡編程實戰(zhàn)UDP

DatagramSocket類:《此類表示用來發(fā)送和接收數(shù)據報包的套接字;特點:既能發(fā)送又能接收》

DatagramPacket類:《此類表示數(shù)據報包。數(shù)據報包用來實現(xiàn)無連接包投遞服務。每條報文僅根據該包中包含的信息從一臺機器路由到另一臺機器?!?/b>

使用步驟:【發(fā)送端:《1、創(chuàng)建套接字對象???? 2、封裝數(shù)據報包

3、發(fā)送數(shù)據報包?????? 4、釋放資源》

【接收端:《1、創(chuàng)建套接字對象???? 2、創(chuàng)建數(shù)據報包,用于接收數(shù)據

1、 通過receive方法接收數(shù)據并保存到數(shù)據報包中? 4、釋放資源》

示例代碼:

發(fā)送端《

publicclass SendDemo {

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

// UDP的發(fā)送端

System.out.println("UDP發(fā)送端開啟.....");

// 創(chuàng)建Socket對象

DatagramSocket socket = newDatagramSocket();

// 創(chuàng)建數(shù)據報包

byte[] buf = "來自udp發(fā)送端的數(shù)據".getBytes();

DatagramPacket packet = newDatagramPacket(buf, 0, buf.length,

InetAddress.getLocalHost(),6666);

//發(fā)送數(shù)據

socket.send(packet);

//釋放資源

socket.close();

System.out.println("UDP發(fā)送端關閉.....");

}

}

接收端《

publicclass ReceiveDemo {

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

// udp接收端

System.out.println("UDP接收端開啟.....");

//創(chuàng)建Socket對象

DatagramSocket socket = newDatagramSocket(6666);

//創(chuàng)建一個空的字節(jié)數(shù)組,是真正保存接收數(shù)據的容器

byte[] buf = newbyte[65536];//1024*64=65536

//創(chuàng)建一個空的數(shù)據報包,用于接收來自發(fā)送端的數(shù)據

DatagramPacket packet = newDatagramPacket(buf, buf.length);

//阻塞式方法,接收數(shù)據,將接收到的數(shù)據保存到指定的數(shù)據報包中

socket.receive(packet);

//從數(shù)據報包中獲取數(shù)據

String ip =packet.getAddress().getHostAddress();

//?????????????? packet.getData()

//接收數(shù)據

String data = new String(buf,0, buf.length);

System.out.println("接收到來自"+ip+"的數(shù)據"+data);

System.out.println("UDP接收端關閉.....");

//釋放資源

socket.close();

}

}

1.3????簡易聊天室

練習:使用UDP協(xié)議實現(xiàn)一個DOS版的簡易聊天室

publicclass UdpExercise {

public static void main(String[] args){

// TODO Auto-generated methodstub

//開啟接收消息的線程

new Thread(newReceiveMsg()).start();

//開啟一個發(fā)送消息的線程

new Thread(newSendMsg()).start();

}

}

//UDP接收器

class ReceiveMsg implements Runnable{

@Override

public void run() {

// TODOAuto-generated method stub

DatagramSocketsocket = null;

try {

socket =new DatagramSocket(8888);

for(;;){

byte[]buf = new byte[1024];

DatagramPacketpacket = new DatagramPacket(buf, buf.length);

socket.receive(packet);

Stringip = packet.getAddress().getHostAddress();

Stringdata = new String(buf, 0, packet.getLength());

System.out.println(ip+":"+data);

}

} catch(SocketException e) {

// TODOAuto-generated catch block

e.printStackTrace();

} catch (IOExceptione) {

// TODOAuto-generated catch block

e.printStackTrace();

}finally{

if(socket!=null){

socket.close();

socket=null;

}

}

}

}

//udp發(fā)送器

class SendMsg implements Runnable {

DatagramSocket socket = null;

@Override

public void run() {

// TODOAuto-generated method stub

try {

socket =new DatagramSocket();

BufferedReaderbr = new BufferedReader(new InputStreamReader(

System.in));

String line= null;

while((line = br.readLine()) != null) {

byte[]buf = line.getBytes();

DatagramPacketpacket = new DatagramPacket(buf, 0,

buf.length,InetAddress.getByName("192.168.95.255"),

8888);

socket.send(packet);

}

} catch (Exceptione) {

// TODOAuto-generated catch block

e.printStackTrace();

}finally{

if(socket!= null){

socket.close();

socket= null;

}

}

}

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 引言:網絡編程作為開發(fā)服務端和客戶端必不可少的技術之一,在Java中也實現(xiàn)的十分完備,今天對Java的網絡編程方面...
    cp_insist閱讀 423評論 0 0
  • 導讀目錄 UDP協(xié)議的基礎 使用DatagramSocket發(fā)送、接受數(shù)據 使用MulticastSocket實現(xiàn)...
    ql2012jz閱讀 855評論 0 1
  • Socket 套接字/插座 在網絡編程中所有的數(shù)據傳遞都是依賴于Socke來完成的,要求進行通信的兩臺計算機都要安...
    _98k閱讀 516評論 2 6
  • 大家好,我是徐愛卿。博客地址:flutterall.com 引言 Android網絡編程一直都是我想記錄的一篇文章...
    徐愛卿閱讀 45,872評論 52 218
  • 1. 網絡編程概述 1.1 計算機網絡 是指將地理位置不同的具有獨立功能的多臺計算機及其外部設備,通過通信線路連接...
    JackChen1024閱讀 1,132評論 0 3

友情鏈接更多精彩內容