常见的通讯协议有udp和tcp。

先来简单了解一下这两个协议各自的特点:

UDP:

--将数据及源、目的封装在数据包中,不需要建立连接;

--每个数据包的大小限制在64k以内;

--因无连接,是不可靠协议;

--不需要建立连接,所以传输速度快,但是容易丢失数据;

总之:Udp是面向无连接的通讯协议,传输数据时,不管对端服务是否启动,直接发送。

日常中使用Udp技术的软件有:飞秋、视频会议等;

TCP:

--建立连接,形成传输数据的通道;

--在连接中进行大的数据量传输;

--通过三次握手完成连接,是可靠协议;

--必须建立连接,效率会稍低;

日常中使用Tcp技术的软件有:打电话的场景,下载。

了解了以上两种常用的通讯协议之后,再认识一下网络通讯的机制:Socket

Socket:

--就是为网络服务提供的一种机制;

--通信的两端都有Socket;

--网络通信其实就是Socket建的通信;

--数据再两个Socket间通过 IO 传输。

也可以这样理解:Socket就像连接航线两端的港口。

============================优雅的分割线============================

我们在实现网络编程时,最重要的是要理解并掌握其实现的原理:

下面先讲解一下Udp传输的原理:

--1、Udp传输技术基于 DatagramSocket 与 DatagramPacket对象;

--2、建立发送端、接收端;

--3、建立数据包;

--4、调用Socket的发送接收方法;

--5、关闭Socket;

--6、发送端和接收端是两个独立的运行程序;

下面来看一个简单Udp传输Demo:

//发送端:

package com.shindo.java.udp;

import java.net.*;

/**
* 需求:通过Udp传输方式,将一段文字数据发送 出去;
*
* 思路:
* 1、建立UdpSocket服务;
* 2、提供数据,并将数据封装到数据包中;
* 3、通过Socket服务的发送功能,将数据包发出去
* 4、关闭资源
*/
public class UdpSend {
public static void main(String[] args)throws Exception{
//1、创建Udp服务,通过DatagramSocket对象
DatagramSocket ds = new DatagramSocket(); //2、确定数据,并封装成数据包
byte[] buf = "This's UdpSend test first Demo".getBytes(); /*DatagramPacket(byte[] buf, int length, InetAddress address, int port)
构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
*/
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),11010); //3、通过Socket服务,将已有的数据包发送出去,通过send方法
ds.send(dp); Thread.sleep(10000);
//4、关闭资源
ds.close();
}
}

//接收端:

package com.shindo.java.udp;
import java.net.*;
/**
* 需求:定义一个应用程序,用于接收Udp协议传输的数据并处理
*
* 思路:
* 1、定义UdpSocket服务,并监听一个端口;
* 2、定义个数据包,因为要存储接收到的字节数据--数据包对象中封装了提取字节数据信息的方法;
* 3、通过Socket服务的receive方法将收到的数据存入已定义好的数据包中;
* 4、通过数据包对象的特有功能,将这些不同的数据去除,打印在控制台上;
* 5、关闭资源
*/
public class Udpreceive {
public static void main(String[] args)throws Exception{
//创建UdpSocket,建立端点
DatagramSocket ds = new DatagramSocket(11010); while(true){
//2、定义数据包用于存储数据
byte[] buf = new byte[1024];
/*
* DatagramPacket(byte[] buf, int length)
构造 DatagramPacket,用来接收长度为 length 的数据包。
*/
DatagramPacket dp = new DatagramPacket(buf,buf.length); //3、通过数服务的receive方法,将收到的数据存入数据包中
ds.receive(dp); //4、通过数据包的方法获取其中的数据
String ip = dp.getAddress().getHostAddress();
System.out.println(ip + "..........is connected");
String data = new String(dp.getData(),0,dp.getLength());//只打印接收数据的长度,不打印全部缓冲流
System.out.println(data);
int port = dp.getPort();
System.out.println("port:" + port); //5、关闭资源
ds.close();
}
}
}

运行结果:

127.0.0.1..........is connected
This's UdpSend test first Demo
port:52793
Exception in thread "main" java.net.SocketException: Socket closed
at java.net.PlainDatagramSocketImpl.receive0(Native Method)
at java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:136)
at java.net.DatagramSocket.receive(DatagramSocket.java:725)
at com.shindo.java.udp.Udpreceive.main(Udpreceive.java:28)

============================优雅的分割线============================

上面的Demo我们可以看到只是实现了简单的客户端发送,服务端读取并展示的过程。而且客户端只能发送特定的内容:This's UdpSend test first Demo

我们下面就把客户端改写一下,让它能够读取键盘录入的信息:

//发送端:使用键盘录入信息

package com.shindo.java.udp;
import java.io.*;
import java.net.*;
/**
* 需求:实现发送信息的键盘录入
*/
public class UdpSendKeyboard {
public static void main(String[] args) throws Exception{
DatagramSocket ds = new DatagramSocket();
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = bufr.readLine()) != null ){
if("byebye".equals(line)) break; byte[] buf = line.getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),11010); ds.send(dp);
}
ds.close();
}
}

UDP通讯协议的更多相关文章

  1. JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用

    JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...

  2. UDP通讯协议实例

    1.服务端 import java.io.IOException; import java.net.*; public class UDPDemo { public static void main( ...

  3. java基础55 UDP通讯协议和TCP通讯协议

    本文知识点(目录): 1.概述    2.UDP通讯协议    3.TCPP通讯协议 1.概述 1.在java中网络通讯作为Socket(插座)通讯,要求两台都必须安装socket.    2.不同的 ...

  4. C#中的TCP通讯与UDP通讯

    最近做了一个项目,主要是给Unity3D和实时数据库做通讯接口.虽然方案一直在变:从开始的UDP通讯变为TCP通讯,然后再变化为UDP通讯;然后通讯的对象又发生改变,由与数据库的驱动进行通讯(主动推送 ...

  5. Tcp通讯协议

    了解了Udp通讯协议之后,我们再认识一个常用的通讯协议:Tcp Tcp传输特点: --依赖于Socket和ServerSocket对象 --建立客户端和服务端 --建立连接后,通过Socket中的 I ...

  6. TCP/IP 中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议

    原文地址:http://hi.baidu.com/albyuyrgqgbbhoq/item/65006d2d002ab33195f62ba1 TCP/IP(Transmission Control P ...

  7. LWIP裸机环境下实现TCP与UDP通讯

    前面移植了LWIP,并且简单的实用了DHCP的功能,今天来使用一下实际的数据通讯的功能 首先是实现TCP客户端,我先上代码 #ifndef __TCP_CLIENT_H_ #define __TCP_ ...

  8. UDP通讯

    上一篇有说到TCP通讯,这篇来谈谈UDP通讯方式 基于Udp协议是无连接模式通讯,占用资源少,响应速度快,延时低.至于可靠性,可通过应用层的控制来满足.(不可靠连接) (1).建立一个套接字(Sock ...

  9. tcp/ip (网络通讯协议)

    介绍 TCP: 传输控制协议, IP: 网际协议, TCP/IP: 供已连接互联网的计算机之间进行通信的通信协议 在tcp/ip内部 , 包含一系列处理数据通信的协议: tcp.udp.icmp.dh ...

随机推荐

  1. MSSQL Express版本自动备份数据库

    由于Express版本的数据库没有自动备份数据库的功能,所以需要自己搭建好备份功能 一.具体原理: 1.利用SQL备份命令:Backup Database 2.使用sqlcmd执行备份命令 3.使用系 ...

  2. 【C疯狂的教材】(九)C语言指针(一)

    1.什么是地址? 内存是由若干个1个字节的内存单元组成的存储器 计算机为了管理内存单元.给每一个字节都进行编号 编号的就是地址 2.什么是指针? 地址就是指针 地址: 地址指向的内存单元值:编号相应的 ...

  3. C++11中正則表達式測试

    VC++2010已经支持regex了, 能够用来编译下述代码. #include <string> #include <regex> #include <iostream ...

  4. 代码实现Layout android:layout_alignParentRight

    代码实现Layout android:layout_alignParentRight 例如: android:id="@+id/account_option" android:la ...

  5. AIX 常用命令和知识

      BOOTLIST:#bootlist -m normal -o (查看bootlist)#bootlist -m normal (设置bootlist为空,谁要在我机器上执行我就要哭了)#boot ...

  6. 用CSS3写的钟表

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  7. 前端--关于HTML

    在讲HTML之前不得不先简单粗略提一下浏览器以及浏览器与HTML的关系.众所周知,浏览器就是一个应用程序,这个应用程序可以完成网络调用.展示接收的html文档等.严格来讲HTML文档就是按照某个规则写 ...

  8. 需求管理(REQM,Requirements Management)工具(转)

    需求管理(REQM,Requirements Management)属于成熟度2级(受管理级)的过程域,是其他许多过程域实施的前提.对于暂未实施CMMI的企业,同样也可以借鉴CMMI的原则,实施和优化 ...

  9. MVC 路由Router

    Url路由将进入的请求发送给控制器操作. url路由使用路由表处理进入的请求 此路由表在应用程序第一次启动时创建. 路由表在Global.asax文件中设置

  10. Java------------运算符优先级速记口诀

    单目乘加位关系,逻辑三目后赋值. 单目:单目运算符+ –(负数) ++ -- 等 乘加(乘除加减):算数单目运算符* / % + - 位:位移单目运算符<< >> 关系:关系单 ...