闲来无事,写个基于UDP协议的Socket通讯Demo
项目一期已经做完,二期需求还没定稿,所以最近比较闲。
上一篇写的是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的更多相关文章
- 闲来无事,写个基于TCP协议的Socket通讯Demo
.Net Socket通讯可以使用Socket类,也可以使用 TcpClient. TcpListener 和 UdpClient类.我这里使用的是Socket类,Tcp协议. 程序很简单,一个命令行 ...
- 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程
Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...
- python 全栈开发,Day34(基于UDP协议的socket)
昨日内容回顾 网络的基础概念arp协议 :通过ip地址找到mac地址五层模型 : 应用层 传输层 网络层 数据链路层 物理层tcp协议 : 可靠的 面向连接 全双工 三次握手 四次挥手udp协议 : ...
- 基于UDP协议的socket编程
UDP协议特点: 1.无连接.服务端与客户端传输数据之前不需要进行连接,且没有超时重发等机制,只是把数据通过网络发送出去.也正是因为此特点,所以基于UDP协议的socket的客户端在启动之前不需要先启 ...
- day31——recv工作原理、高大上版解决粘包方式、基于UDP协议的socket通信
day31 recv工作原理 源码解释: Receive up to buffersize bytes from the socket. 接收来自socket缓冲区的字节数据, For the opt ...
- 网络编程: 基于UDP协议的socket
udp是无链接的,启动服务之后可以直接接受消息,不需要提前建立链接 UDP协议的通信优势: 允许一个服务器同时和多个客户端通信, TCP不行 服务端 import socket sk = socket ...
- 基于UDP协议的socket套接字编程
目录 一.UDP套接字简单示例 1.1 服务端 二.客户端 三.UPD套接字无粘包问题 3.1 服务端 3.2 客户端 四.qq聊天 4.1 服务端 4.2 客户端1 4.3 客户端2 4.4 运行结 ...
- 基于UDP协议的socket编程示例
客户端 import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; impo ...
- 基于UDP协议的socket通信
服务器端: 1.创建DatagramSocket,指定端口号 2.创建DatagramPacket 3.接收客户端发送的数据信息 4.读取数据 客户端: 1.定义发送信息 2.创建DatagramPa ...
随机推荐
- 为什么axios请求接口会发起两次请求
之前在使用axios发现每次调用接口都会有两个请求,第一个请求时option请求,而且看不到请求参数,当时也没注意,只当做是做了一次预请求,判断接口是否通畅,但是最近发现并不是那么回事. 首先我们知道 ...
- Error:failed to find Build Tools revision 23.0.0 rc3
解决,选择AS里有的版本就可以了,已有的我这就一个23.0.3,导入的项目是23.0.2 Donate:)
- 在Centos中部署redis运行状态图形化监控工具 — RedisLive
写在前面 前两天看到张善友老师的一篇文章<先定个小目标, 使用C# 开发的千万级应用>,里面给出了一张腾讯OA基础服务中redis运行情况的一张监控图,然后想到自己的项目中前不久也上了re ...
- Visual Studio的背景插件
分享一个Visual Studio的背景插件,让堆码更富情趣..哈哈 忘记一件重要的事情,我使用的是VS 2012版,其他更高版本应该是可以找到的,以下版本就不清楚了.有可能找不到,见谅,也不是我 ...
- offsetParent的解释
offsetParent是个只读属性,返回最近显示指定位置的容器元素的父级.如果元素没有指定位置,最近的元素或者根元素(标准模式下是html,怪异模式下是body)就是offsetParent off ...
- Nginx + Tomcat Windows下的负载均衡配置
Nginx + Tomcat Windows下的负载均衡配置 一.为什么需要对Tomcat服务器做负载均衡? Tomcat服务器作为一个Web服务器,其并发数在300-500之间,如果超过50 ...
- IE不能上网,但是其他浏览器可以
打开IE_工具_internet选项_连接_局域网设置_(勾选)自动检测配置其它的勾去掉,确定.
- linux通过挂载系统光盘搭建本地yum仓库的方法
1.挂载光盘 [root@localhost ~]# mount /dev/cdrom /media/cdrom/ mount: /dev/sr0 写保护,将以只读方式挂载 /media下的cdrom ...
- 两种方式testng dataprovider结合csv做测试驱动
方式一: 第一.读取csv数据源码 import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream ...
- [转]ubuntu 下无法启动chrome
这很不爽,google了半天也不知道答案(搜索到要重装chrome,可是我怎么都卸载不干净.....),最终解决方法如下: -------------------------------------- ...