项目一期已经做完,二期需求还没定稿,所以最近比较闲。

  上一篇写的是TCP协议,今天写一下UDP协议。TCP是有连接协议,所以发送和接收消息前客户端和服务端需要建立连接;UDP是无连接协议,所以发送消息前不需要建立连接,只需向指定的网络端点发送消息即可,不管端点是否存在都可以发送,无论消息是否到达端点都不关心,接收消息前也不需要建立连接,只需要在本地绑定的端口上接收就可以了,UDP没有明确的客户端和服务端。

  程序是基于命令行的,启动一个实例之后根据界面提示输入本地端口号、远程IP、远程端口号即可,可以启动多个实例互相通讯。

  程序启动之后首先根据输入的本地端口号绑定本地端口,其次启动一个线程接收本地端口的数据,然后界面上提示输入消息,输入完成则发送到远程IP和远程端口号,界面上再次提示输入消息……

  运行效果图:

图1. 实例1

图2. 实例2

关键代码

  绑定本地端口:

 var localPoint = new IPEndPoint(, localPort);
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.Bind(localPoint);

  

  启动线程执行数据接收:

 // 启动新线程负责接收数据
ThreadPool.QueueUserWorkItem(OnReceive, socket);
Show("准备就绪");

  数据接收细节:

 /// <summary>
/// 接收数据
/// </summary>
/// <param name="obj"></param>
private static void OnReceive(object obj)
{
try
{
var socket = obj as Socket;
if (socket == null)
{
return;
} while (true)
{
try
{
var receiveBuffer = new byte[];
// 接收数据
EndPoint remotePoint = new IPEndPoint(IPAddress.Any, );
var receiveLength = socket.ReceiveFrom(receiveBuffer, ref remotePoint);
...
}
catch (ThreadAbortException)
{
throw;
}
catch (SocketException exception)
{
...
}
catch (Exception exception)
{
...
}
}
}
catch (ThreadAbortException)
{
...
}
catch (Exception exception)
{
...
}
}

  循环执行数据发送:

 do
{
try
{
Show("请输入消息:", false);
var msg = Read();
...
// 发送数据
EndPoint sendPoint = new IPEndPoint(address, remotePort);
var sendLength = socket.SendTo(sendBuffer, sendPoint);
...
}
catch (SocketException exception)
{
...
}
catch (Exception exception)
{
...
}
} while (true);

  本人才疏学浅,欢迎大家批评指正!

源代码下载

闲来无事,写个基于UDP协议的Socket通讯Demo的更多相关文章

  1. 闲来无事,写个基于TCP协议的Socket通讯Demo

    .Net Socket通讯可以使用Socket类,也可以使用 TcpClient. TcpListener 和 UdpClient类.我这里使用的是Socket类,Tcp协议. 程序很简单,一个命令行 ...

  2. 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

  3. python 全栈开发,Day34(基于UDP协议的socket)

    昨日内容回顾 网络的基础概念arp协议 :通过ip地址找到mac地址五层模型 : 应用层 传输层 网络层 数据链路层 物理层tcp协议 : 可靠的 面向连接 全双工 三次握手 四次挥手udp协议 : ...

  4. 基于UDP协议的socket编程

    UDP协议特点: 1.无连接.服务端与客户端传输数据之前不需要进行连接,且没有超时重发等机制,只是把数据通过网络发送出去.也正是因为此特点,所以基于UDP协议的socket的客户端在启动之前不需要先启 ...

  5. day31——recv工作原理、高大上版解决粘包方式、基于UDP协议的socket通信

    day31 recv工作原理 源码解释: Receive up to buffersize bytes from the socket. 接收来自socket缓冲区的字节数据, For the opt ...

  6. 网络编程: 基于UDP协议的socket

    udp是无链接的,启动服务之后可以直接接受消息,不需要提前建立链接 UDP协议的通信优势: 允许一个服务器同时和多个客户端通信, TCP不行 服务端 import socket sk = socket ...

  7. 基于UDP协议的socket套接字编程

    目录 一.UDP套接字简单示例 1.1 服务端 二.客户端 三.UPD套接字无粘包问题 3.1 服务端 3.2 客户端 四.qq聊天 4.1 服务端 4.2 客户端1 4.3 客户端2 4.4 运行结 ...

  8. 基于UDP协议的socket编程示例

    客户端 import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; impo ...

  9. 基于UDP协议的socket通信

    服务器端: 1.创建DatagramSocket,指定端口号 2.创建DatagramPacket 3.接收客户端发送的数据信息 4.读取数据 客户端: 1.定义发送信息 2.创建DatagramPa ...

随机推荐

  1. C语言(Linux)中常用到的函数

    在接触Linux C之前,我比较少用到的函数,都会记录在这里.(持续更新中……) 在学习malloc()函数原理性实现时, size_t:是一种数据类型,标准C库中定义的一种类型,近似于unsigne ...

  2. Linux学习之三--scp命令

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...

  3. MySQL ROOT密码更改

    MySQLROOT密码 # mysql -u root -p Enter password: ERROR 1045 (28000): Access denied for user 'root'@'lo ...

  4. kali python pip3 的安装和卸载

    今天很高兴安装完成调整了kali 然后看见kali已经帮助我安装了python2.7和python3.5可把我开心坏了,可是2.7有pip,而且包很全,但2.7与3.0切换使用我的就尴尬了 最后在su ...

  5. ORA-00600: internal error code, arguments: [SKGMFAIL], [2], [4], [4], [1], [], [], [], [], [], [], [

    ORA-00600: internal error code, arguments: [SKGMFAIL], [2], [4], [4], [1], [], [], [], [], [], [], [ ...

  6. java 深入技术八(内省)

    1. javabean的软件设计思想 2.内省:封装了java反射,提供直接操作属性的Setter和getter方法的方法 3.核心API:BeanInfo java 的描述信息,Introspect ...

  7. struts2笔记

    Struts2 中, HTML 表单将被直接映射到一个 POJO,通过params拦截器,类中定义对应属性,及对应set方法即可. Struts2 中,任何一个POJO都可以是一个action类. S ...

  8. [转]jquery mobile中redirect重定向问题

    本文转自:http://www.cnblogs.com/freeliver54/p/3529813.html 在jquerymobile提交后如果要进行网页重定向时,一定要在form或<a> ...

  9. SerialPort 串口开发

    private SerialPort sPort = new SerialPort(); //串行端口资源 /// <summary> /// 函数功能:打开串口/关闭串口 /// < ...

  10. Linux /proc/$pid部分内容详解

    auxv /proc/[pid]/auxv包含传递给进程的ELF解释器信息,格式是每一项都是一个unsigned long长度的ID加上一个unsigned long长度的值.最后一项以连续的两个0x ...