Java——UPD输出及优化再优化
生活随笔
收集整理的這篇文章主要介紹了
Java——UPD输出及优化再优化
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
* UPD傳輸不區(qū)分客戶端跟服務(wù)端,* 這里用Send和Receive這兩個(gè)方法決定誰發(fā)誰收
* 1.發(fā)送Send * 創(chuàng)建DatagramSocket,隨機(jī)端口號(hào)* 創(chuàng)建DatagramPacket,指定數(shù)據(jù)、長度、地址、端口* 創(chuàng)建DatagramSocket發(fā)送DatagramPacket* 關(guān)閉DatagramSocket
代碼如下:
package com.wsq.socket;import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.Socket; import java.net.SocketException; import java.net.UnknownHostException;public class Demo1_Send { //發(fā)送端 public static void main(String[] args) throws Exception {String str = "你,陪我度過蟬夏,越過城市喧囂,歌聲還在游走,你榴花般的雙眸,不見你的溫柔,丟失花間歡笑,歲月無法停留,流云的等候~~~"; //所要發(fā)送的數(shù)據(jù)DatagramSocket wsq = new DatagramSocket(); //創(chuàng)建Socket,相當(dāng)于創(chuàng)建碼頭,端口號(hào)可以不指定,可以是隨機(jī)端口號(hào);比如,我有倆手機(jī),用哪個(gè)手機(jī)給你發(fā)短信都是可以的DatagramPacket yy = new DatagramPacket(str.getBytes(), str.getBytes().length,InetAddress.getByName("192.168.1.178"),6666);//getByName里面填你要發(fā)送人的IP地址和要發(fā)送到的端口號(hào)//創(chuàng)建Packet,相當(dāng)于是集裝箱wsq.send(yy); //發(fā)貨,將數(shù)據(jù)發(fā)出去,( 碼頭.send(集裝箱) )wsq.close(); //底層是IO流,用完之后也得關(guān)掉,關(guān)閉碼頭}} * 2,接收Receive* 創(chuàng)建DatagramSocket,指定端口號(hào) 也就是說,去哪個(gè)碼頭接貨* 創(chuàng)建DategramPacket,指定數(shù)組,長度 接貨的時(shí)候,得用箱子去裝* 使用DategramSocket接收DatagramPacket Socket調(diào)用receive方法去接收Socket就行了* 關(guān)閉DatagramSocket* 從DatagramPacket中獲取數(shù)據(jù)代碼如下:
package com.wsq.socket;import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException;public class Demo2_Receive { //接收端public static void main(String[] args) throws Exception {DatagramSocket wsq = new DatagramSocket(6666); //創(chuàng)建Socket,相當(dāng)于創(chuàng)建碼頭,里面添加你想要接收的端口號(hào),也就是去哪個(gè)碼頭接貨DatagramPacket yy = new DatagramPacket(new byte[1024], 1024); //創(chuàng)建Packet,相當(dāng)于創(chuàng)建集裝箱,最好大小匹配 wsq.receive(yy); //接貨,接收數(shù)據(jù),數(shù)據(jù)全在Packet里面;(碼頭.集裝箱)byte [] arr = yy.getData(); //獲取數(shù)據(jù),發(fā)過來的是一些字節(jié)數(shù)據(jù),所以要用字節(jié)數(shù)組來接收//獲取的不是把有效的獲出來,而是把這里面存儲(chǔ)的1024個(gè)字節(jié)給全部都獲取出來;里面有些是空的沒存東西的,得把有效的字節(jié)個(gè)數(shù)給獲取出來int len = yy.getLength(); //獲取有效的字節(jié)個(gè)數(shù)//知道有效的字節(jié)個(gè)數(shù)了,也知道數(shù)據(jù)了,然后轉(zhuǎn)換為對(duì)應(yīng)的字符串System.out.println(new String (arr,0,len)); //arr,0,len;將arr這個(gè)數(shù)組,從0開始到len結(jié)束wsq.close();}}代碼的運(yùn)行,這里為了看出效果,在DOS模擬器下運(yùn)行兩個(gè)程序;先運(yùn)行接收端,再運(yùn)行發(fā)送端
接收端:
發(fā)送端:
發(fā)送端將
“你,陪我度過蟬夏,越過城市喧囂,歌聲還在游走,你榴花般的雙眸,不見你的溫柔,丟失花間歡笑,歲月無法停留,流云的等候~~~”這個(gè)數(shù)據(jù),
給發(fā)送到接收端,接收端已接收
從這上面的例子可以看出,只能傳遞指定的數(shù)據(jù),上面的例子只是傳輸了一句話而已,那要是想要傳輸鍵盤錄入的數(shù)據(jù)又該怎樣傳輸呢?于是,小編做了些代碼的優(yōu)化:
package www.wsq.Socket;import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; import java.util.Scanner;public class Demo1_Send { //發(fā)送端public static void main(String[] args) throws Exception {Scanner sc = new Scanner(System.in); //創(chuàng)建鍵盤錄入對(duì)象scDatagramSocket wsq = new DatagramSocket(); //創(chuàng)建Socket,相當(dāng)于創(chuàng)建碼頭,端口號(hào)可以不指定,可以是隨機(jī)端口號(hào);比如,我有倆手機(jī),用哪個(gè)手機(jī)給你發(fā)短信都是可以的while(true){ //想把數(shù)據(jù)不斷的發(fā)送,這里就定義了一個(gè)while循環(huán)String line = sc.nextLine(); //不斷地去獲取鍵盤錄入的數(shù)據(jù),獲取鍵盤錄入的字符串if("quit".equals(line)){ //對(duì)字符串做一個(gè)判斷,如果不判斷的話,while這個(gè)循環(huán)永遠(yuǎn)也結(jié)束不了,錄入quit,跳出循環(huán)break;}DatagramPacket yy = new DatagramPacket(line.getBytes(), line.getBytes().length,InetAddress.getByName("192.168.1.178"),6666);//getByName里面填你要發(fā)送人的IP地址和要發(fā)送的數(shù)據(jù)//創(chuàng)建Packet,相當(dāng)于是集裝箱wsq.send(yy); //發(fā)貨,將數(shù)據(jù)發(fā)出去,( 碼頭.send(集裝箱) )} wsq.close(); //底層是IO流,用完之后也得關(guān)掉,關(guān)閉碼頭}} package www.wsq.Socket;import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException;public class Demo2_Receive { //接收端public static void main(String[] args) throws Exception {DatagramSocket wsq = new DatagramSocket(6666); //創(chuàng)建Socket,相當(dāng)于創(chuàng)建碼頭,里面添加你想要接收的端口號(hào),也就是去哪個(gè)碼頭接貨DatagramPacket yy = new DatagramPacket(new byte[1024], 1024); //創(chuàng)建Packet,相當(dāng)于創(chuàng)建集裝箱,最好大小匹配 while(true){ //while循環(huán),不斷地去接收數(shù)據(jù)wsq.receive(yy); //接貨,接收數(shù)據(jù),數(shù)據(jù)全在Packet里面;(碼頭.集裝箱)byte [] arr = yy.getData(); //獲取數(shù)據(jù),發(fā)過來的是一些字節(jié)數(shù)據(jù),所以要用字節(jié)數(shù)組來接收//獲取的不是把有效的獲出來,而是把這里面存儲(chǔ)的1024個(gè)字節(jié)給全部都獲取出來;里面有些是空的沒存東西的,得把有效的字節(jié)個(gè)數(shù)給獲取出來int len = yy.getLength(); //獲取有效的字節(jié)個(gè)數(shù)/*加個(gè)IP地址和端口號(hào),為了看的更加明顯點(diǎn)*/String ip = yy.getAddress().getHostAddress(); //獲取IP地址int port = yy.getPort(); //獲取端口號(hào)//知道有效的字節(jié)個(gè)數(shù)了,也知道數(shù)據(jù)了,然后轉(zhuǎn)換為對(duì)應(yīng)的字符串System.out.println(ip + ":" + port + ":" + new String (arr,0,len)); //arr,0,len;將arr這個(gè)數(shù)組,從0開始到len結(jié)束//輸出IP地址加端口號(hào)加要發(fā)送的內(nèi)容//由于要不斷地接收數(shù)據(jù),這里的流就不管了//wsq.close();}}}這樣就可以實(shí)現(xiàn)多數(shù)據(jù)的發(fā)送與接收了
左邊是接收端,右邊是發(fā)送端
從這上面兩個(gè)例子可以看出,程序運(yùn)行得啟動(dòng)兩個(gè)DOS模擬器窗口,很麻煩,那,要是想要再一個(gè)窗口下執(zhí)行,又該怎么辦呢?這里就要用到多線程,開啟兩條線程,同時(shí)在主線程里面跑,這就可以同時(shí)運(yùn)行,接收的同時(shí)再去發(fā)送,于是,小編在代碼的優(yōu)化的基礎(chǔ)上又做了些優(yōu)化:
package com.wsq.socket;import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner;public class Demo3_MoreThread {public static void main(String[] args) {new Receive().start(); //開啟線程 new Send().start(); //開啟線程}}class Send extends Thread{public void run(){try {Scanner sc = new Scanner(System.in); //創(chuàng)建鍵盤錄入對(duì)象scDatagramSocket wsq = new DatagramSocket(); //創(chuàng)建Socket,相當(dāng)于創(chuàng)建碼頭,端口號(hào)可以不指定,可以是隨機(jī)端口號(hào);比如,我有倆手機(jī),用哪個(gè)手機(jī)給你發(fā)短信都是可以的while(true){ //想把數(shù)據(jù)不斷的發(fā)送,這里就定義了一個(gè)while循環(huán)String line = sc.nextLine(); //不斷地去獲取鍵盤錄入的數(shù)據(jù),獲取鍵盤錄入的字符串if("quit".equals(line)){ //對(duì)字符串做一個(gè)判斷,如果不判斷的話,while這個(gè)循環(huán)永遠(yuǎn)也結(jié)束不了,錄入quit,跳出循環(huán)break;}DatagramPacket yy = new DatagramPacket(line.getBytes(), line.getBytes().length,InetAddress.getByName("192.168.1.178"),6666);//getByName里面填你要發(fā)送人的IP地址和要發(fā)送的數(shù)據(jù)//創(chuàng)建Packet,相當(dāng)于是集裝箱wsq.send(yy); //發(fā)貨,將數(shù)據(jù)發(fā)出去,( 碼頭.send(集裝箱) )} wsq.close(); //底層是IO流,用完之后也得關(guān)掉,關(guān)閉碼頭} catch (IOException e) {e.printStackTrace();}} }class Receive extends Thread{public void run(){try {DatagramSocket wsq = new DatagramSocket(6666); //創(chuàng)建Socket,相當(dāng)于創(chuàng)建碼頭,里面添加你想要接收的端口號(hào),也就是去哪個(gè)碼頭接貨DatagramPacket yy = new DatagramPacket(new byte[1024], 1024); //創(chuàng)建Packet,相當(dāng)于創(chuàng)建集裝箱,最好大小匹配 //只能try,catch捕獲異常,因?yàn)樵趓un方法里面不能拋異常while(true){ //while循環(huán),不斷地去接收數(shù)據(jù)wsq.receive(yy); //接貨,接收數(shù)據(jù),數(shù)據(jù)全在Packet里面;(碼頭.集裝箱)byte [] arr = yy.getData(); //獲取數(shù)據(jù),發(fā)過來的是一些字節(jié)數(shù)據(jù),所以要用字節(jié)數(shù)組來接收//獲取的不是把有效的獲出來,而是把這里面存儲(chǔ)的1024個(gè)字節(jié)給全部都獲取出來;里面有些是空的沒存東西的,得把有效的字節(jié)個(gè)數(shù)給獲取出來int len = yy.getLength(); //獲取有效的字節(jié)個(gè)數(shù)/*加個(gè)IP地址和端口號(hào),為了看的更加明顯點(diǎn)*/String ip = yy.getAddress().getHostAddress(); //獲取IP地址int port = yy.getPort(); //獲取端口號(hào)//知道有效的字節(jié)個(gè)數(shù)了,也知道數(shù)據(jù)了,然后轉(zhuǎn)換為對(duì)應(yīng)的字符串System.out.println(ip + ":" + port + ":" + new String (arr,0,len)); //arr,0,len;將arr這個(gè)數(shù)組,從0開始到len結(jié)束//輸出IP地址加端口號(hào)加要發(fā)送的內(nèi)容//由于要不斷地接收數(shù)據(jù),這里的流就不管了//wsq.close();} } catch (IOException e) {e.printStackTrace();}} }總結(jié)
以上是生活随笔為你收集整理的Java——UPD输出及优化再优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “临堂观秋草”下一句是什么
- 下一篇: Java—— TCP协议(相关代码实现以