溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

12.7-全棧Java筆記:Java網(wǎng)絡(luò)編程(五)

發(fā)布時(shí)間:2020-07-02 11:06:05 來(lái)源:網(wǎng)絡(luò) 閱讀:347 作者:全棧Java 欄目:建站服務(wù)器

UDP通訊的實(shí)現(xiàn)

1.DatagramSocket:用于發(fā)送或接收數(shù)據(jù)包

當(dāng)服務(wù)器要向客戶端發(fā)送數(shù)據(jù)時(shí),需要在服務(wù)器端產(chǎn)生一個(gè)DatagramSocket對(duì)象,在客戶端產(chǎn)生一個(gè)DatagramSocket對(duì)象。服務(wù)器端的DatagramSocket將DatagramPacket發(fā)送到網(wǎng)絡(luò)上,然后被客戶端的DatagramSocket接收。

DatagramSocket有兩種構(gòu)造函數(shù)。一種是無(wú)需任何參數(shù)的,常用于客戶端。另一種需要指定端口,常用于服務(wù)器。

常用方法:send、receive、 close

 

2.DatagramPacket:數(shù)據(jù)容器(封包)的作用

常用方法:構(gòu)造函數(shù)、getAddrress(獲取發(fā)送或接收方計(jì)算機(jī)的IP地址)、getData(獲取發(fā)送或接收的數(shù)據(jù))、setData(設(shè)置發(fā)送的數(shù)據(jù))

 

3.UDP通信編程基本步驟:

a)創(chuàng)建客戶端的DatagramSocket,創(chuàng)建時(shí),定義客戶端的監(jiān)聽端口

b)創(chuàng)建服務(wù)器端的DatagramSocket,創(chuàng)建時(shí),定義服務(wù)器端的監(jiān)聽端口

c)在服務(wù)器端定義DatagramPacket對(duì)象,封裝待發(fā)送的數(shù)據(jù)包。

d)服務(wù)器端將數(shù)據(jù)包發(fā)送出去

e)客戶端接收數(shù)據(jù)包

【示例1】客戶端與服務(wù)器端單向通信之客戶端

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetSocketAddress;

 

public class Client {

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

       byte[] b = "aaaa".getBytes();

        //必須告訴數(shù)據(jù)包要發(fā)到哪里去

       DatagramPacket dp = new DatagramPacket(b,b.length,new   InetSocketAddress("localhost",8999));

       //我本身占用9000端口向外面機(jī)器發(fā)數(shù)據(jù)包

       DatagramSocket ds = new DatagramSocket(9000);

       ds.send(dp);

       ds.close();

    }

} 

【示例2】客戶端與服務(wù)器端單向通信之服務(wù)器端

import java.net.DatagramPacket;

import java.net.DatagramSocket;

 

public class Server {

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

       DatagramSocket ds = new DatagramSocket(8999);

       byte[] b = new byte[1024];

       DatagramPacket dp = new DatagramPacket(b,b.length);

      

       ds.receive(dp);  //阻塞式方法

       String string = new   String(dp.getData(),0,dp.getLength());    //dp.getLength()返回實(shí)際收到的數(shù)據(jù)的字節(jié)數(shù)

       System.out.println(string);

       ds.close();

    }

}

通過(guò)ByteArrayInputStreamByteArrayOutputStream可以傳遞基本類型數(shù)據(jù)。

【示例3】客戶端

public class Client {

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

       long n = 2000L;

        ByteArrayOutputStream bos = new ByteArrayOutputStream();

       DataOutputStream   dos = new   DataOutputStream(bos);

       dos.writeLong(n);

       byte[] b = bos.toByteArray();

      

       //必須告訴數(shù)據(jù)包要發(fā)到哪里去

       DatagramPacket dp = new DatagramPacket(b,b.length,new   InetSocketAddress("localhost",8999));

       //我本身占用9000端口向外面機(jī)器發(fā)數(shù)據(jù)包

       DatagramSocket ds = new DatagramSocket(9000);

       ds.send(dp);

       ds.close();

    }

} 

【示例4】服務(wù)器端

public class Server {

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

       DatagramSocket ds = new DatagramSocket(8999);

       byte[] b = new byte[1024];

       DatagramPacket dp = new DatagramPacket(b,b.length);

      

       ds.receive(dp);  //阻塞式方法

       ByteArrayInputStream   bis = new   ByteArrayInputStream(dp.getData());

       DataInputStream   dis = new   DataInputStream(bis);

       System.out.println(dis.readLong());

       ds.close();  

}

}

通過(guò)ByteArrayInputStreamByteArrayOutputStream可以傳遞對(duì)象。

【示例5Person(客戶端與服務(wù)器端都需要存在Person)

class Person implements Serializable{

    int age;

    String name;

    public Person(int age, String name) {

       super();

       this.age = age;

       this.name = name;

    }

}

【示例6】客戶端

public class Client {

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

       Person person = new Person(20,"aa");

 

       ByteArrayOutputStream   bos = new   ByteArrayOutputStream();

       ObjectOutputStream   oos = new   ObjectOutputStream(bos);

       oos.writeObject(person);

       byte[] b = bos.toByteArray();

      

       //必須告訴數(shù)據(jù)包要發(fā)到哪里去

       DatagramPacket dp = new DatagramPacket(b,b.length,new   InetSocketAddress("localhost",8999));

       //我本身占用9000端口向外面機(jī)器發(fā)數(shù)據(jù)包

       DatagramSocket ds = new DatagramSocket(9000);

       ds.send(dp);

       ds.close();

    }

}  

【示例7】服務(wù)器端

public class Server {

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

       DatagramSocket ds = new DatagramSocket(8999);

       byte[] b = new byte[1024];

       DatagramPacket dp = new DatagramPacket(b,b.length);

      

       ds.receive(dp);  //阻塞式方法

 

       ByteArrayInputStream   bis = new   ByteArrayInputStream(dp.getData());

       ObjectInputStream   ois = new   ObjectInputStream(bis);

       Person   person = (Person) ois.readObject();

       System.out.println(person.name);

       ds.close();

    }

}




「全棧Java筆記」是一部能幫大家從零到一成長(zhǎng)為全棧Java工程師系列筆記。筆者江湖人稱 Mr. G,10年Java研發(fā)經(jīng)驗(yàn),曾在神州數(shù)碼、航天院某所研發(fā)中心從事軟件設(shè)計(jì)及研發(fā)工作,從小白逐漸做到工程師、高級(jí)工程師、架構(gòu)師。精通Java平臺(tái)軟件開發(fā),精通JAVAEE,熟悉各種流行開發(fā)框架。


 筆記包含從淺入深的六大部分:

 A-Java入門階段

 B-數(shù)據(jù)庫(kù)從入門到精通

 C-手刃移動(dòng)前端和Web前端

 D-J2EE從了解到實(shí)戰(zhàn)

 E-Java高級(jí)框架精解

 F-Linux和Hadoop 



向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI