* 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. 约瑟夫问题(优化优化再优化)

    1 什么是约瑟夫问题 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围. 从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的 ...

  2. java用数组输出fibo_[Java教程]养兔子Fibo函数优化

    [Java教程]养兔子Fibo函数优化 0 2017-02-24 00:00:16 Title 本文网址:http://www.shaoqun.com/a/302303.html *特别声明:以上内容 ...

  3. 一起进阶学习JAVA:MySQL海量数据存储与优化

    一起进阶学习JAVA:MySQL海量数据存储与优化 第一部分 分库分表实战及中间件 1.1 背景介绍 1.1.1 背景描述 刚开始我们的系统只用了 单机数据库 随着用户的不断增多,考虑到系统的高可用和 ...

  4. java 概率 算法_使用概率算法优化快速排序(JAVA)

    前言 前面一篇文章系统介绍了快速排序算法,提到快速排序虽然平均时间复杂度为o(n*log2(n)),效率相对比较高.但是其在特殊情况下,比如降序的情况下,效率和冒泡排序一致,这就削弱了快速排序给人的好 ...

  5. java split()方法_Java编程性能优化一些事儿

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 Smile and stop complaining about the t ...

  6. 深入理解java虚拟机--线程安全与锁优化

    深入理解java虚拟机--线程安全与锁优化 面向过程编程思想和面向对象编程思想 java语言中的线程安全 线程安全的实现方法 锁优化 面向过程编程思想和面向对象编程思想 面向过程编程思想:站在计算机的 ...

  7. 伪共享和缓存行填充,Java并发编程还能这么优化!

    前言 关于伪共享的文章已经很多了,对于多线程编程来说,特别是多线程处理列表和数组的时候,要非常注意伪共享的问题.否则不仅无法发挥多线程的优势,还可能比单线程性能还差.随着JAVA版本的更新,再各个版本 ...

  8. java 锁升级_Java并发 锁优化和锁升级

    前言 本篇文章介绍Java Synchronized锁优化. 锁是存在哪里的,怎么标识是什么锁 Monitor机制在Java中怎么表现的 锁优化 锁升级 1. 锁存在哪里 对象在内存中的布局分为三块区 ...

  9. Java并发学习二:编译优化带来的有序性问题导致的并发Bug

    Java并发学习系列文章:Java并发学习-博客专栏 今天在学习极客时间专栏:<Java并发编程实战> 第一讲01 | 可见性.原子性和有序性问题:并发编程Bug的源头中提到: 编译器及解 ...

最新文章

  1. kwargs.pop是什么意思
  2. 简单总结nodejs处理tcp连接的核心流程
  3. linux设置默认时区,关于linux:如何修改-Linux-默认时区
  4. android sdk版本兼容,Android 版本兼容
  5. 平流式沉淀池表面负荷怎么计算_沉淀池表面负荷
  6. 简单的故事品味生活,
  7. java nio 详_java nio详解
  8. StretchBlt()函数使用
  9. 9. 2019美赛论文提交注意事项
  10. 手机怎么在线拍照翻译英语?这个方法不能不知道
  11. 学习笔记(27):玩转Python-Python3基础入门-案例-快递价格计算器(2)
  12. 疫情之下,这10个技巧助你开启云面试的正确姿势
  13. 【提问的智慧】-[How To Ask Questions The Smart Way]
  14. jemalloc源码解读(六)基数树
  15. Python抓图必学的8种方式!
  16. python实现批量识别图片文字,生成对应的txt文件
  17. linux中的硬盘分区和挂载
  18. 一文了解蛋白功能结构域预测与分析
  19. JDK生成证书,在Nginx中配置HTTP+SSL
  20. 苹果官网对xcode版本的要求

热门文章

  1. 5天玩转mysql视频教程_六天带你玩转MySQL
  2. 福州大学计算机专业考研,2015年福州大学计算机考研经验贴
  3. Elements in iteration expect to have v-bind:key directives错误的解决办法
  4. H5之audio标签放音兼容所有浏览器方法
  5. AngularJS(三):重复HTML元素、数据绑定
  6. 如何用纯 CSS 创作一个冒着热气的咖啡杯
  7. Shell 简单的java微服务jar包 -- 部署脚本
  8. Eclipse安装TestNG插件
  9. netcore 内存限制_.NET Core 和 Serverless 构建飞速发展的架构
  10. jq获取input选取的文件名_tushare获取交易数据并可视化分析