Java——UPD輸出及優化再優化

 * UPD傳輸不區分客戶端跟服務端,* 這里用Send和Receive這兩個方法決定誰發誰收
 * 1.發送Send         * 創建DatagramSocket,隨機端口號* 創建DatagramPacket,指定數據、長度、地址、端口* 創建DatagramSocket發送DatagramPacket* 關閉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 {                                   //發送端                                  public static void main(String[] args) throws Exception {String str = "你,陪我度過蟬夏,越過城市喧囂,歌聲還在游走,你榴花般的雙眸,不見你的溫柔,丟失花間歡笑,歲月無法停留,流云的等候~~~";                 //所要發送的數據DatagramSocket wsq = new DatagramSocket();          //創建Socket,相當于創建碼頭,端口號可以不指定,可以是隨機端口號;比如,我有倆手機,用哪個手機給你發短信都是可以的DatagramPacket yy = new DatagramPacket(str.getBytes(), str.getBytes().length,InetAddress.getByName("192.168.1.178"),6666);//getByName里面填你要發送人的IP地址和要發送到的端口號//創建Packet,相當于是集裝箱wsq.send(yy);                                       //發貨,將數據發出去,(   碼頭.send(集裝箱)   )wsq.close();                                        //底層是IO流,用完之后也得關掉,關閉碼頭}}
 * 2,接收Receive* 創建DatagramSocket,指定端口號           也就是說,去哪個碼頭接貨* 創建DategramPacket,指定數組,長度     接貨的時候,得用箱子去裝* 使用DategramSocket接收DatagramPacket Socket調用receive方法去接收Socket就行了* 關閉DatagramSocket* 從DatagramPacket中獲取數據

代碼如下:

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);                  //創建Socket,相當于創建碼頭,里面添加你想要接收的端口號,也就是去哪個碼頭接貨DatagramPacket    yy = new DatagramPacket(new byte[1024], 1024); //創建Packet,相當于創建集裝箱,最好大小匹配  wsq.receive(yy);                                                  //接貨,接收數據,數據全在Packet里面;(碼頭.集裝箱)byte [] arr = yy.getData();                                       //獲取數據,發過來的是一些字節數據,所以要用字節數組來接收//獲取的不是把有效的獲出來,而是把這里面存儲的1024個字節給全部都獲取出來;里面有些是空的沒存東西的,得把有效的字節個數給獲取出來int len = yy.getLength();                                         //獲取有效的字節個數//知道有效的字節個數了,也知道數據了,然后轉換為對應的字符串System.out.println(new String (arr,0,len));                        //arr,0,len;將arr這個數組,從0開始到len結束wsq.close();}}

代碼的運行,這里為了看出效果,在DOS模擬器下運行兩個程序;先運行接收端,再運行發送端

接收端:這里寫圖片描述
發送端:這里寫圖片描述

發送端將

“你,陪我度過蟬夏,越過城市喧囂,歌聲還在游走,你榴花般的雙眸,不見你的溫柔,丟失花間歡笑,歲月無法停留,流云的等候~~~”這個數據,

給發送到接收端,接收端已接收

從這上面的例子可以看出,只能傳遞指定的數據,上面的例子只是傳輸了一句話而已,那要是想要傳輸鍵盤錄入的數據又該怎樣傳輸呢?于是,小編做了些代碼的優化:

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 {                                  //發送端public static void main(String[] args) throws Exception {Scanner sc = new Scanner(System.in);                //創建鍵盤錄入對象scDatagramSocket wsq = new DatagramSocket();          //創建Socket,相當于創建碼頭,端口號可以不指定,可以是隨機端口號;比如,我有倆手機,用哪個手機給你發短信都是可以的while(true){                                        //想把數據不斷的發送,這里就定義了一個while循環String line = sc.nextLine();                    //不斷地去獲取鍵盤錄入的數據,獲取鍵盤錄入的字符串if("quit".equals(line)){                        //對字符串做一個判斷,如果不判斷的話,while這個循環永遠也結束不了,錄入quit,跳出循環break;}DatagramPacket yy = new DatagramPacket(line.getBytes(), line.getBytes().length,InetAddress.getByName("192.168.1.178"),6666);//getByName里面填你要發送人的IP地址和要發送的數據//創建Packet,相當于是集裝箱wsq.send(yy);                                   //發貨,將數據發出去,(   碼頭.send(集裝箱)   )}                                               wsq.close();                                        //底層是IO流,用完之后也得關掉,關閉碼頭}}
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);                  //創建Socket,相當于創建碼頭,里面添加你想要接收的端口號,也就是去哪個碼頭接貨DatagramPacket    yy = new DatagramPacket(new byte[1024], 1024); //創建Packet,相當于創建集裝箱,最好大小匹配  while(true){                                                      //while循環,不斷地去接收數據wsq.receive(yy);                                              //接貨,接收數據,數據全在Packet里面;(碼頭.集裝箱)byte [] arr = yy.getData();                                   //獲取數據,發過來的是一些字節數據,所以要用字節數組來接收//獲取的不是把有效的獲出來,而是把這里面存儲的1024個字節給全部都獲取出來;里面有些是空的沒存東西的,得把有效的字節個數給獲取出來int len = yy.getLength();                                     //獲取有效的字節個數/*加個IP地址和端口號,為了看的更加明顯點*/String ip = yy.getAddress().getHostAddress();                 //獲取IP地址int port = yy.getPort();                                      //獲取端口號//知道有效的字節個數了,也知道數據了,然后轉換為對應的字符串System.out.println(ip + ":" + port + ":" + new String (arr,0,len));                        //arr,0,len;將arr這個數組,從0開始到len結束//輸出IP地址加端口號加要發送的內容//由于要不斷地接收數據,這里的流就不管了//wsq.close();}}}

這樣就可以實現多數據的發送與接收了

這里寫圖片描述
左邊是接收端,右邊是發送端

從這上面兩個例子可以看出,程序運行得啟動兩個DOS模擬器窗口,很麻煩,那,要是想要再一個窗口下執行,又該怎么辦呢?這里就要用到多線程,開啟兩條線程,同時在主線程里面跑,這就可以同時運行,接收的同時再去發送,于是,小編在代碼的優化的基礎上又做了些優化:


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);                //創建鍵盤錄入對象scDatagramSocket wsq = new DatagramSocket();          //創建Socket,相當于創建碼頭,端口號可以不指定,可以是隨機端口號;比如,我有倆手機,用哪個手機給你發短信都是可以的while(true){                                        //想把數據不斷的發送,這里就定義了一個while循環String line = sc.nextLine();                    //不斷地去獲取鍵盤錄入的數據,獲取鍵盤錄入的字符串if("quit".equals(line)){                        //對字符串做一個判斷,如果不判斷的話,while這個循環永遠也結束不了,錄入quit,跳出循環break;}DatagramPacket yy = new DatagramPacket(line.getBytes(), line.getBytes().length,InetAddress.getByName("192.168.1.178"),6666);//getByName里面填你要發送人的IP地址和要發送的數據//創建Packet,相當于是集裝箱wsq.send(yy);                                   //發貨,將數據發出去,(   碼頭.send(集裝箱)   )}                                               wsq.close();                                        //底層是IO流,用完之后也得關掉,關閉碼頭} catch (IOException e) {e.printStackTrace();}}
}class Receive extends Thread{public void run(){try {DatagramSocket   wsq = new DatagramSocket(6666);                  //創建Socket,相當于創建碼頭,里面添加你想要接收的端口號,也就是去哪個碼頭接貨DatagramPacket    yy = new DatagramPacket(new byte[1024], 1024); //創建Packet,相當于創建集裝箱,最好大小匹配  //只能try,catch捕獲異常,因為在run方法里面不能拋異常while(true){                                                      //while循環,不斷地去接收數據wsq.receive(yy);                                              //接貨,接收數據,數據全在Packet里面;(碼頭.集裝箱)byte [] arr = yy.getData();                                   //獲取數據,發過來的是一些字節數據,所以要用字節數組來接收//獲取的不是把有效的獲出來,而是把這里面存儲的1024個字節給全部都獲取出來;里面有些是空的沒存東西的,得把有效的字節個數給獲取出來int len = yy.getLength();                                     //獲取有效的字節個數/*加個IP地址和端口號,為了看的更加明顯點*/String ip = yy.getAddress().getHostAddress();                 //獲取IP地址int port = yy.getPort();                                      //獲取端口號//知道有效的字節個數了,也知道數據了,然后轉換為對應的字符串System.out.println(ip + ":" + port + ":" + new String (arr,0,len));                        //arr,0,len;將arr這個數組,從0開始到len結束//輸出IP地址加端口號加要發送的內容//由于要不斷地接收數據,這里的流就不管了//wsq.close();} } catch (IOException e) {e.printStackTrace();}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379843.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379843.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379843.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FLEX:圖形制作皮膚vs編程制作皮膚

Styles(樣式)提供了一個可以自定義flex外觀的層.可以圖形制作皮膚,也可以編程實現. (小小菜鳥翻譯) 圖形制作皮膚的 優點是 很容易實現,通過位圖,矢量圖,swf。 缺點是功能有限。…

Java文件類boolean canExecute()方法(帶示例)

文件類boolean canExecute() (File Class boolean canExecute()) This method is available in package java.io.File.canExecute(). 軟件包java.io.File.canExecute()中提供了此方法。 This method is used to execute the file and the file is represented by the abstract …

python安全攻防---scapy使用

導入scapy包 from scapy.all import *構造包 a Ether()/IP(dst114.114.114.114)/TCP(dport80)/應用層數據我們如果記不得每個包的選項使,可以使用show()來查看 print(a.show())發送包 sr(IP(dst‘192.168.1.0/24’)/TCP(dport(1,65535)), timeout2) &#xff1…

唉!

學習到后面時,再返回看了一下前面學過的,發現以前學過,看不懂的東西現在能看懂了…… !不過 為什么在剛學時就是不懂,這樣 不就老是慢一拍嗎?唉!!轉載于:https://www.cnblogs.com/ni…

Java—— TCP協議(相關代碼實現以及相關優化)

代碼運行的時候先運行服務端,然后在運行客戶端 * TCP協議:* 1,客戶端* 創建Socket連接服務器(指定IP地址,端口號)通過IP地址找到對應的服務器* 調用Socket的getInputStream()和getOutputStream()方法獲取和服務器端相連…

什么是adsense 想通過廣告掙錢的看過來

Adsense的含義Google AdSense是由Google公司推出的針對網站主(簡稱發布商)的一個互聯網廣告服務。AdSense是個合成詞。其中ad是“廣告”之意,sense是“感知”之意,綜合起來的意思就是相關廣告。Google通過程序來分析網站的內容&am…

Java GregorianCalendar getTimeZone()方法與示例

GregorianCalendar類的getTimeZone()方法 (GregorianCalendar Class getTimeZone() method) getTimeZone() method is available in java.util package. getTimeZone()方法在java.util包中可用。 getTimeZone() method is used to return the time zone for this GregorianCale…

python安全攻防---信息收集---ICMP主機探測 以及optionparser的使用

0x01 基礎概念 ICMP(Internet control Message Protocal)Internet報文協議,是TCP/IP的一種子協議,屬于網絡層協議,其目的是用于在IP主機、路由器之間傳遞控制信息 0x02 程序 程序 # -*- coding:utf-8 -*- from sca…

PHP文件系統-文件下載

一、網頁請求和響應的過程 請求: 1. HTTP 1.1 協議 版本 2. 頭信息,請求的ip,其他 3. 你請求的表單信息, 你提交給服務器的信息 http://localhost/one.php?aabbb&cccdd 響應: 1. 狀態 200 ok 404 頁面沒找到 2. 響應頭信息&a…

Java——網絡編程練習

練習一(黑馬程序員面試題):客戶端向服務器寫字符串(鍵盤錄入),服務器(多線程)將字符串反轉后寫回,客戶端再次讀取到的是反轉后的字符串 相關代碼如下: package com.wsq.test;import java.io.BufferedReader; import java.io.Buf…

第一章 基礎知識---1.4Crack小實驗--復現

0x01 程序及其編譯環境 程序如下&#xff0c;功能&#xff1a;我們必須輸入正確的密碼1234567才能得到密碼驗證的確認&#xff0c;跳出循環。否則程序提示密碼錯誤再次輸入。 #include <stdio.h>#define PASSWORD "1234567"int verify_password(char* passwo…

.net中調用exchange服務器發郵件

普通的郵件, 用System.Net.Mail 類 或 System.Web.Mail 類 處理即可, 但是Exchange Server 環境下, 這兩個類起不了作用-------至少目前我看到的情況如此. 整個過程如下: 1. 先添加COM 引用 "Microsoft CDO for Windows 2000 Library" .2. 發送郵件的代碼: CDO.Messa…

Java Double類doubleToLongBits()方法與示例

Double類doubleToLongBits()方法 (Double class doubleToLongBits() method) doubleToLongBits() method is available in java.lang package. doubleToLongBits()方法在java.lang包中可用。 doubleToLongBits() method follows IEEE 754 double floating-point standards and …

Firefox(火狐瀏覽器)彩蛋

①在地址欄上輸入&#xff1a; about:mozilla ②在地址欄上輸入&#xff1a; about:robots ③在地址欄上輸入&#xff1a; www.figma.com/404/ ④地址欄上輸入&#xff1a; chrome://global/content/alerts/alert.xul

jquery.history插件在ie中失效的問題

hash標志中不能有? ff中不存在這個問題。 轉載于:https://www.cnblogs.com/xyun/archive/2008/12/01/1345188.html

Java——反射(Class.forName()讀取配置文件舉例).

榨汁機(Juicer)榨汁機的案例&#xff1a; 分別有水果(Fruit),蘋果(Apple)&#xff0c;香蕉(Bananal)&#xff0c;橘子(Orange),榨汁(squeeze) 要求&#xff1a; 榨出不同的水果汁來喝 //一般方法求解 package com.testl;public class Text1 {public static void main(Strin…

java 根據類名示例化類_Java類類getEnclosingClass()方法及示例

java 根據類名示例化類類的類getEnclosingClass()方法 (Class class getEnclosingClass() method) getEnclosingClass() method is available in java.lang package. getEnclosingClass()方法在java.lang包中可用。 getEnclosingClass() method is used to return recent or im…

C++:cin.getline

轉&#xff1a;百度百科 http://baike.baidu.com/view/2383876.htm cin.getline 此函數是按行讀取,其語法為:cin.getline(字符指針,字符個數N,結束符); 功能是&#xff1a;一次讀取多個字符(包括空白字符&#xff09;&#xff0c;直到讀滿N-1個&#xff0c;或者遇到指定的結束符…

端口復用和重映射--STM32F103

什么是端口復用&#xff1f; STM32中有很多內置外設&#xff0c;這些外設的引腳都是與GPIO復用的&#xff0c;什么時候復用呢&#xff1f;就是當一個GPIO作為內置外設引腳使用時&#xff0c;就叫做復用。比如串口1的發送接收引腳是PA9&#xff0c;PA10&#xff0c;當PA9&#…

考研數學

眼前儼然一副冬的氣象&#xff0c;伴隨氣溫的驟降&#xff0c;考研復習也進入異常緊張的階段。在考試前這兩個月里&#xff0c;考生如何復習數學&#xff0c;成績還可以有所提高。萬學?海文數學教研組針對沖刺階段數學復習歸納總結以下復習經驗和建議&#xff0c;供大家參考。…