java-----Socket编程之UDP
来源:互联网 发布:哨兵数据波段介绍 编辑:程序博客网 时间:2024/05/17 12:49
* UDP:
* 1,不需要建立连接,将数据及源和目的封装成数据包中。
* 2,每个数据大小的限制在64k内
* 3,因为无连接,是不可靠协议。
* 4,不需要建立连接,速度快。
*
* TCP:
* 1,需要建立连接,形成传输数据的通道。
* 2,在连接中进行大量数据传输
* 3,通过三次握手完成连接,是可靠协议。
* 4,需要建立连接,速度比UDP慢
*
UDP:
主要类:DatagramSocket DatagramPacket
DatagramSocket 一个是插座 , DatagramPacket一个是包 将数据放入包中 然后通过插座 从 客户端 发送到服务端
举例: 发送一次:
首先是发送端(客户端):
import java.net.*;import java.io.*;public class UDPClient{ public static void main(String[] args) throws Exception {// 1,创建UDP服务,通过DatagramSocketDatagramSocket ds = new DatagramSocket();// 2,确定数据,并封装成数据包 DatagramSocket// (buf,buf.length,InetAddress.getByName("127.0.0.1"),10000);byte[] buf = "this is test".getBytes();DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("127.0.0.1"), 10000);// 3,通过socket服务,将已有的数据包发送出去,通过send方法ds.send(dp);// 4,关闭资源ds.close(); }}
然后是接收端(服务端)
import java.net.*;import java.io.*;public class UDPServer{ public static void main(String[] args) throws Exception {// 1,创建udp socket,建立端点DatagramSocket ds = new DatagramSocket(10000);// 2,定义数据包,用于存储数据。byte[] buf = new byte[1024];DatagramPacket dp = new DatagramPacket(buf, buf.length);// 3,通过服务的receeive方法将接收到的数据存入数据包中。ds.receive(dp);// 3,通过服务的receeive方法将接收到的数据存入数据包中。int port;//获取端口System.out.println("ip:" + dp.getPort());//获取数据System.out.println("接收到了:"+ new String(dp.getData(), 0, dp.getLength()));// 关闭资源ds.close(); }}
*******************
下面使用循环的方式 以及 键盘输入的方式 达到 传输数据
是上面例子的增强:
发送端:
import java.net.*;import java.io.*;public class UDPClient{ public static void main(String[] args) throws Exception {// 创建UDP服务,通过DatagramSocketDatagramSocket ds = new DatagramSocket();// 因为用到键盘 用到转换流BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));// 开始读取String line = null;while ((line = bufr.readLine()) != null){ // 如果输入886则退出客户端 if ("886".equals(line)) {break; } // 将数据转换成比特数组 byte[] buf = line.getBytes(); // 将数据打成包 DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 10000); // 通过socket服务,将已有的数据包发送出去,通过send方法 ds.send(dp);}ds.close(); }}
接收端:
import java.net.*;import java.io.*;public class UDPServer{ public static void main(String[] args) throws Exception {// 1,创建udp socket,建立端点DatagramSocket ds = new DatagramSocket(10000);// 2,定义数据包,用于存储数据。byte[] buf = new byte[1024];DatagramPacket dp = new DatagramPacket(buf, buf.length);// 得到的数据String data = new String(dp.getData(), 0, dp.getLength());// 3,通过服务的receeive方法将接收到的数据存入数据包中// 循环接收。 while (true){ //接收数据 ds.receive(dp); // 3,通过服务的receeive方法将接收到的数据存入数据包中。 System.out.println("ip:" + new String(dp.getAddress().getHostAddress())); System.out.println("接收到了:" + new String(dp.getData(), 0, dp.getLength()));} }}
**************************************************************************************************************************************************************************************
下面是综合性的:
需求 :编写 一个聊天程序,有收数据的部分和发数据的部分,
这两部分需要同时执行。
那就需要用到多线程技术
一个线程控制收取,一个线程控制发送
因为收和发是不一致的,所以要定义两个runfangfa
而且这两个方法要封装到不同的类中。
import java.net.*;import java.io.*;class UDPTest{ public static void main(String[] args) throws Exception {DatagramSocket sendSocket = new DatagramSocket();DatagramSocket receSocket = new DatagramSocket(10001);new Thread(new Send(sendSocket)).start();new Thread(new Rece(receSocket)).start(); }}// 这是发送端 使用线程 继承了runnable接口 实现 run方法class Send implements Runnable{ private DatagramSocket ds; public Send(DatagramSocket ds) {this.ds = ds; } public void run() {try{ // 下面就是通过键盘读数据然后封装到包中传送出去 BufferedReader bufr = new BufferedReader(new InputStreamReader( System.in)); String line = null; while ((line = bufr.readLine()) != null) {if ("886".equals(line)){ break;}byte[] buf = line.getBytes();DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("127.0.0.1"), 10001);ds.send(dp); }} catch (Exception e){ throw new RuntimeException("发送数据出现错误");}ds.close(); }}// 这是接收端 一样用线程 实现接口 重写run方法class Rece implements Runnable{ private DatagramSocket ds; public Rece(DatagramSocket ds) {this.ds = ds; } public void run() {try{ while (true) {byte[] buf = new byte[1024];DatagramPacket dp = new DatagramPacket(buf,buf.length);ds.receive(dp);String ip = new String(dp.getAddress().getHostAddress());String data = new String(dp.getData(),0,dp.getLength());System.out.println("ip:"+ip +"说::"+data); }} catch (Exception ex){ throw new RuntimeException("接收数据时错误");} }}
- java-----Socket编程之UDP
- Java Socket 编程学习之 UDP
- Java UDP Socket编程
- JAVA Socket之UDP
- 【java编程】Socket编程之UDP模拟简单聊天功能
- C# Socket编程之UDP
- Linux 编程之 【socket】 udp
- 十、Socket之UDP编程
- socket编程之udp发送 .
- 计算机网络socket编程之UDP
- 网络编程之udp socket
- Linux之UDP SOCKET 编程
- UDP之socket编程实例
- Java---Socket编程UDP/TCP
- Java---Socket编程UDP/TCP
- Java---Socket编程UDP/TCP
- Java---Socket编程UDP/TCP
- Java socket编程--TCP UDP
- 将VMware虚拟化平台与EMC VPLEX配合使用(一) - VPLEX概述
- MFC消息处理流程概述
- CAJview
- hadoop深入研究:(二)——java访问hdfs
- 矩阵键盘
- java-----Socket编程之UDP
- ODS(操作数据存储)
- 缺失索引
- DateTime格式
- ifconfig
- 第九次试验任务
- 使用struts2和uploadify实现多文件上传
- request.getContextPath. getServletPath
- seajs使用注意点