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();}}
}
Java——UPD输出及优化再优化相关推荐
- 约瑟夫问题(优化优化再优化)
1 什么是约瑟夫问题 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围. 从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的 ...
- java用数组输出fibo_[Java教程]养兔子Fibo函数优化
[Java教程]养兔子Fibo函数优化 0 2017-02-24 00:00:16 Title 本文网址:http://www.shaoqun.com/a/302303.html *特别声明:以上内容 ...
- 一起进阶学习JAVA:MySQL海量数据存储与优化
一起进阶学习JAVA:MySQL海量数据存储与优化 第一部分 分库分表实战及中间件 1.1 背景介绍 1.1.1 背景描述 刚开始我们的系统只用了 单机数据库 随着用户的不断增多,考虑到系统的高可用和 ...
- java 概率 算法_使用概率算法优化快速排序(JAVA)
前言 前面一篇文章系统介绍了快速排序算法,提到快速排序虽然平均时间复杂度为o(n*log2(n)),效率相对比较高.但是其在特殊情况下,比如降序的情况下,效率和冒泡排序一致,这就削弱了快速排序给人的好 ...
- java split()方法_Java编程性能优化一些事儿
点击上方 "程序员小乐"关注, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 Smile and stop complaining about the t ...
- 深入理解java虚拟机--线程安全与锁优化
深入理解java虚拟机--线程安全与锁优化 面向过程编程思想和面向对象编程思想 java语言中的线程安全 线程安全的实现方法 锁优化 面向过程编程思想和面向对象编程思想 面向过程编程思想:站在计算机的 ...
- 伪共享和缓存行填充,Java并发编程还能这么优化!
前言 关于伪共享的文章已经很多了,对于多线程编程来说,特别是多线程处理列表和数组的时候,要非常注意伪共享的问题.否则不仅无法发挥多线程的优势,还可能比单线程性能还差.随着JAVA版本的更新,再各个版本 ...
- java 锁升级_Java并发 锁优化和锁升级
前言 本篇文章介绍Java Synchronized锁优化. 锁是存在哪里的,怎么标识是什么锁 Monitor机制在Java中怎么表现的 锁优化 锁升级 1. 锁存在哪里 对象在内存中的布局分为三块区 ...
- Java并发学习二:编译优化带来的有序性问题导致的并发Bug
Java并发学习系列文章:Java并发学习-博客专栏 今天在学习极客时间专栏:<Java并发编程实战> 第一讲01 | 可见性.原子性和有序性问题:并发编程Bug的源头中提到: 编译器及解 ...
最新文章
- kwargs.pop是什么意思
- 简单总结nodejs处理tcp连接的核心流程
- linux设置默认时区,关于linux:如何修改-Linux-默认时区
- android sdk版本兼容,Android 版本兼容
- 平流式沉淀池表面负荷怎么计算_沉淀池表面负荷
- 简单的故事品味生活,
- java nio 详_java nio详解
- StretchBlt()函数使用
- 9. 2019美赛论文提交注意事项
- 手机怎么在线拍照翻译英语?这个方法不能不知道
- 学习笔记(27):玩转Python-Python3基础入门-案例-快递价格计算器(2)
- 疫情之下,这10个技巧助你开启云面试的正确姿势
- 【提问的智慧】-[How To Ask Questions The Smart Way]
- jemalloc源码解读(六)基数树
- Python抓图必学的8种方式!
- python实现批量识别图片文字,生成对应的txt文件
- linux中的硬盘分区和挂载
- 一文了解蛋白功能结构域预测与分析
- JDK生成证书,在Nginx中配置HTTP+SSL
- 苹果官网对xcode版本的要求
热门文章
- 5天玩转mysql视频教程_六天带你玩转MySQL
- 福州大学计算机专业考研,2015年福州大学计算机考研经验贴
- Elements in iteration expect to have v-bind:key directives错误的解决办法
- H5之audio标签放音兼容所有浏览器方法
- AngularJS(三):重复HTML元素、数据绑定
- 如何用纯 CSS 创作一个冒着热气的咖啡杯
- Shell 简单的java微服务jar包 -- 部署脚本
- Eclipse安装TestNG插件
- netcore 内存限制_.NET Core 和 Serverless 构建飞速发展的架构
- jq获取input选取的文件名_tushare获取交易数据并可视化分析