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.mzph.cn/news/379843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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

0x01 基础概念 ICMP(Internet control Message Protocal)Internet报文协议,是TCP/IP的一种子协议,属于网络层协议,其目的是用于在IP主机、路由器之间传递控制信息 0x02 程序 程序 # -*- coding:utf-8 -*- from sca…

第一章 基础知识---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…

端口复用和重映射--STM32F103

什么是端口复用&#xff1f; STM32中有很多内置外设&#xff0c;这些外设的引脚都是与GPIO复用的&#xff0c;什么时候复用呢&#xff1f;就是当一个GPIO作为内置外设引脚使用时&#xff0c;就叫做复用。比如串口1的发送接收引脚是PA9&#xff0c;PA10&#xff0c;当PA9&#…

[转]Ubuntu远程桌面登陆

原文地址&#xff1a;http://www.cnblogs.com/xdzone/archive/2011/03/10/1979644.html 1.xp下默认的远程桌面协议是rdp&#xff0c;默认端口3389&#xff0c;而ubuntu用的时vnc&#xff1a;默认端口5900 2.首先被访问的主机&#xff08;windows/linux&#xff09;都要设置为允…

NVIC中断管理---STM32

NVIC&#xff1a;嵌套向量中断控制器 在了解中断之前&#xff0c;我们先了解抢占优先级和响应优先级 抢占优先级和响应优先级 抢占优先级决定能不能打断&#xff0c;高优先级的抢占可以中断低优先级的抢占响应优先级在抢占优先级相同时&#xff0c;高响应优先级先执行&#x…

外部中断---STM32F1

外部中断概述 STM32的中断控制器支持19个外部中断/事件请求&#xff1a; 线0-15&#xff1a;对应外部IO口的输入中断线16&#xff1a;连接到PVD输出线17&#xff1a;连接到RTC闹钟事件线18&#xff1a;连接到USB唤醒事件 STM32每个IO口都有可以作为外部中断输入&#xff0c;…

转:点9图

关于”点九” 转&#xff1a;http://mux.baidu.com/?p1506“点九”是andriod平台的应用软件开发里的一种特殊的图片形式&#xff0c;文件扩展名为&#xff1a;.9.png 智能手机中有自动横屏的功能,同一幅界面会在随着手机(或平板电脑)中的方向传感器的参数不同而改变显示的方向…

串口通信的基本原理----STM32

串口通信基本原理 1. 处理器与外部设置通信的基本方式 并行通信&#xff1a;数据各个位同时传输串行通信&#xff1a;数据按位顺序传输 在串行通信中&#xff0c;按照数据的传输方向&#xff0c;又分为&#xff1a; 单工&#xff1a;数据传输只支持在一个方向传输半双工&am…

Spring MVC+Ant+Tomcat+Eclipse最简单的demo

第一步是Java的Web环境搭建&#xff0c;下载Eclipse&#xff08;或者更好的但收费的IDE-IntelliJ Idea&#xff0c;和Resharper一家公司出的&#xff09;&#xff0c;下载Tomcat&#xff0c;下载JDK&#xff0c;下载Spring&#xff0c;注意安装Tomcat的时候配置一下管理员账号和…

MySQL的环境变量配置详细步骤

1.下载MySQL 例如下载&#xff1a;mysql-installer-community-5.5.60.1 我以这个版本为例 2.右击->我的电脑->属性 3. 4.找到在 系统变量 中找到 Path 5.找MySql的bin目录&#xff08;每个人的电脑上这个文件的位置应该是差不多的&#xff0c;找到之后复制下来&#x…

串口发送通信---UART发送---STM32F4实现

串口发送程序配置过程&#xff08;HAL库&#xff09; 初始化串口相关参数&#xff0c;使能串口 HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart)该函数的参数是串口的基址&#xff0c;在stm32f429xx.h文件中&#xff0c;定义了8个UART_HandleTypeDef的值&#x…

开源软件 许可证密钥_自由和开源软件-1中的重要许可证

开源软件 许可证密钥Its important to take note that there are no good or bad licenses and that no license is superior to another. Anybody can make an open-source license that suits their extravagant, which is the explanation that there are such huge numbers…

串口接收中断配置过程---STM32F4--HAL

串口接收中断程序配置过程&#xff08;HAL&#xff09; 初始化相关参数&#xff0c;使能串口&#xff1a; HAL_UART_Init();该函数的参数是串口的基址&#xff0c;在stm32f429xx.h文件中&#xff0c;定义了8个UART_HandleTypeDef的值&#xff0c;分别是USART1、USART2、USART…

定时器--STM32f4--HAL

基本概念 STM32中有三种定时器&#xff0c;高级定时器&#xff0c;通用定时器&#xff0c;基本定时器&#xff0c;具体如下图&#xff1a; 发生如下事件将产生中断/DMA 更新&#xff1a;计数器向上溢出/向下溢出&#xff0c;计数器初始化触发事件&#xff1a;计数器启动、停…

独立看门狗---STM32----HAL

基本概念 看门狗解决的问题是什么&#xff1f; 在系统跑飞&#xff08;程序异常执行&#xff09;的情况&#xff0c;是系统复位&#xff0c;程序重新执行。 独立看门狗适应用于需要看门狗作为一个在主程序之外能够完全独立工作&#xff0c;并且对时间精度要求低的场合。 工…

IIC通信---EEPROM24C02---STMF4

IIC通信协议 IIC是同步半双工通信&#xff0c;一个数据线SDA和一个时钟SCL线&#xff0c;可以接受和发送数据。在CPU与被控IC之间、IC与IC之间进行双向传送。 空闲状态 IIC总线的SDA和SCL两条信号线同时处于高电平时&#xff0c;规定为总线的空闲状态。 起始信号 当SCL为高…

JavaScript | 使用提示从用户输入值

Example 1) Input name and print 示例1)输入名称和打印 Code (JS & HTML): 代码(JS和HTML)&#xff1a; <!DOCTYPE html><HTML><HEAD><SCRIPT>var name prompt("Enter Your name:");var msg "Welcome "name;//alert(msg)…

项目管理中工作分解结构模型(WBSM)的应用

摘要 本文根据工作分解结构(WBS)的工作特点&#xff0c;运用系统工程的思想理论方法&#xff0c;构建了工作分解结构模型&#xff0c;并提出了模型算法;该模型方法的建立使得WBS工作更加简单可靠、思路清晰、基于更加可靠的科学基础之上。 1、工作分解结构模型(WBSM)方法工作程…

SPI通信原理---STM32F4--HAL

SPI接口原理 SPI是一种高速全双工同步通信&#xff0c;在芯片管脚上占用四根线&#xff0c;主要应用在EEPROM、FLASH、实时时钟、AD转换器&#xff0c;还有数字信号处理器和数字信号解码器之间。 SPI接口使用4根线通信。 MISO&#xff1a;主设备数据输入&#xff0c;从设备数…