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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;供大家参考。…