-
UDP单播
2017-10-12 20:02:45Java实现UDP单播对于最近所做的Android手机端遥控器APP,用到了UDP组播和广播方面的知识,虽然网络传输方面并不是由我负责,但是由于期间遇到一些问题,所以我的求知欲有蠢蠢欲动,自己就去了解了一下这方面的知识,...Java实现UDP单播
对于最近所做的Android手机端遥控器APP,用到了UDP组播和广播方面的知识,虽然网络传输方面并不是由我负责,但是由于期间遇到一些问题,所以我的求知欲有蠢蠢欲动,自己就去了解了一下这方面的知识,首先从UDP单播开始给大家分享一下我在学习过程中的感悟。对于UDP的概念在这里就不多做介绍了。
参考链接
http://blog.csdn.net/ljheee/article/details/51722792
查阅了一些前人的博客,对于我而言感觉这位大神写的特别的好,分析很到位,代码也很简洁,直接从用Java来演绎了UDP的使用。
http://blog.csdn.net/a10615/article/details/52395592
然后结合了这位前辈对UDP连接客户端和服务端的API的介绍结合起来理解运用起来就更加理解了。UDP单播客户端代码
/** * UDP单播的例子 * @author WangHang * */ public class UdpClient { public static void main(String[] args) { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); DatagramSocket clientSocket = null; byte[] receiveData = new byte[1024]; try { clientSocket = new DatagramSocket(); InetAddress inetAddress = InetAddress.getByName("localhost"); // 其实此处的connect方法并不是太符合UDP的设计理念 // 因为UDP是面向非连接的,说的简单点,瞎发就行了至于有没有人收到,关我神马事,所以还是采用数据包指定IP和端口的方法吧 clientSocket.connect(inetAddress, 8899); String data = reader.readLine(); byte[] sendData = data.getBytes("utf-8"); DatagramPacket datagramPacket = new DatagramPacket(sendData, sendData.length); // 当Client没有事先连接到目标IP的端口时(没有调用上面的connect方法),可以在发送的数据包中加上对应的IP和端口 // DatagramPacket datagramPacket = new DatagramPacket(sendData, sendData.length,inetAddress,8899); clientSocket.send(datagramPacket); DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); clientSocket.receive(receivePacket); InetAddress address = receivePacket.getAddress(); System.out.println(address); if (address != null) { String receive = new String(receivePacket.getData()); System.out.println(receive); } } catch (SocketException e) { e.printStackTrace(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (clientSocket != null) { clientSocket.close(); } try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } }
UDP单播服务端代码
/** * UDP单播服务端测试代码 * @author WangHang * */ public class UdpServer { public static void main(String[] args) { DatagramSocket serverSocket = null; try { serverSocket = new DatagramSocket(8899); byte [] receiveData = new byte[1024]; while (true) { DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); serverSocket.receive(receivePacket); System.out.println(new String(receiveData)); InetAddress address = receivePacket.getAddress(); System.out.println(address); int port = receivePacket.getPort(); // 接收到消息之后回发一个消息给Client byte[] sendData = "wanghang".getBytes("utf-8"); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address,port); serverSocket.send(sendPacket); } } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { serverSocket.close(); } } }
注意事项
这里一定要注意这两段代码只是为了更好理解UDP单播的使用,在实际使用当中一定要将他们都写在单独的线程当中,因为网络连接和发送数据是很耗时的。为了便于测试该测试代码直接使用的localhost,如果要通过真实的网络传输,要自己设置目标的IP,测试起来很简单,先运行server端代码,再运行Client端代码,然后就在控制台上输入你要发送的字符串,回车键之后,就会打印出server端接收到的结果。
-
UDP 单播
2018-09-11 19:25:551. Linux 服务端 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include &...a1. Linux 服务端
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #define BUF_SIZE 88 #define PORT 55555 int main(int argc, char *argv[]) { //建立套接字 int sock_fd = socket(AF_INET, SOCK_DGRAM, 0); //IPV4,数据报套接字类型,不指定协议 //说明本服务器地址 const struct sockaddr_in srvaddr = { .sin_family = AF_INET, //协议类型IPV4 .sin_port = htons(PORT), //端口号-网络字节序 .sin_addr.s_addr = htonl(INADDR_ANY) //IP地址-任意地址 }; //绑定地址 bind(sock_fd, (const struct sockaddr *)&srvaddr, sizeof(srvaddr)); //接收数据 char buf[BUF_SIZE] = { 0 }; struct sockaddr_in cliaddr; socklen_t cliaddrlen = sizeof(cliaddr); while (1) { bzero(buf, BUF_SIZE); bzero(&cliaddr, cliaddrlen); recvfrom(sock_fd, buf, BUF_SIZE, 0, (struct sockaddr *)&cliaddr, &cliaddrlen); fprintf(stdout, "Recv from [%s - %hu]:%s", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port), buf); } //关闭套接字 close(sock_fd); return 0; }
2. Linux 客户端
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #define BUF_SIZE 88 #define PROT 55555 #define ADDR "192.168.4.194" int main(int argc, char *argv[]) { //建立套接字 int sock_fd = socket(AF_INET, SOCK_DGRAM, 0); //IPV4,数据报套接字类型,不指定协议 //声明将连接地址 const struct sockaddr_in srvaddr = { .sin_family = AF_INET, //协议类型IPV4 .sin_port = htons(PROT), //端口号-网络字节序 .sin_addr.s_addr = inet_addr(ADDR) //IP地址-字符串转IP }; //发送数据 char buf[BUF_SIZE] = { 0 }; while (1) { bzero(buf, BUF_SIZE); fprintf(stdout, "Say something: "); if (fgets(buf, BUF_SIZE, stdin) == NULL) break; sendto(sock_fd, buf, strlen(buf), 0, (const struct sockaddr*)&srvaddr, sizeof(srvaddr)); } //关闭套接字 close(sock_fd); return 0; }
3. Windows 客户端
#include <stdio.h> #include <WinSock2.h> #pragma comment( lib, "ws2_32.lib") #define BUF_SIZE 88 #define PROT 55555 #define ADDR "192.168.4.194" int main(int argc, char *argv[]) { //初始化SOCKET WSADATA wsaData; int err = WSAStartup(MAKEWORD(1, 1), &wsaData); if (err != 0) { return -1; } if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1) { WSACleanup(); return -1; } //建立套接字 SOCKET sock_fd = socket(AF_INET, SOCK_DGRAM, 0); //IPV4,数据报套接字类型,不指定协议 //声明将连接地址 SOCKADDR_IN srvaddr = { .sin_family = AF_INET, //协议类型IPV4 .sin_port = htons(PROT), //端口号-网络字节序 .sin_addr.s_addr = inet_addr(ADDR) //IP地址-字符串转IP }; //发送数据 char buf[BUF_SIZE] = { 0 }; while (1) { memset(buf, 0, BUF_SIZE); fprintf(stdout, "Say something: "); if (fgets(buf, BUF_SIZE, stdin) == NULL) break; sendto(sock_fd, buf, strlen(buf), 0, (const struct sockaddr*)&srvaddr, sizeof(srvaddr)); } //关闭套接字 closesocket(sock_fd); return 0; }
4. 测试效果
客户端
服务端
-
aeron, 高效可靠的UDP单播UDP多播和IPC消息传输.zip
2019-10-10 02:51:23aeron, 高效可靠的UDP单播UDP多播和IPC消息传输 Aeron 与其他Aeron用户和贡献者进行聊天。 高效可靠的UDP单播。UDP多播和IPC消息传输。 Java和 C++ 客户机在这个存储库中可用,并且可以从方提供一个 .NET 客户机插件... -
UDP单播组播测试sample
2020-07-14 16:13:33附件包含采用C语言实现的UDP单播 组播参考sample代码 里面包含多个sample代码 供学习使用。 -
dotnet-AeronNET高效可靠的UDP单播UDP组播和IPC消息传输
2019-08-15 02:32:31Aeron.NET - 高效可靠的UDP单播, UDP组播和IPC消息传输 - Aeron的.NET移植 -
aeron:高效可靠的UDP单播,UDP组播和IPC消息传输-源码
2021-02-03 17:25:27高效可靠的UDP单播,UDP组播和IPC消息传输。 此存储库中提供Java和C ++客户端,而第三方提供了。 这三个客户端都可以非常高效地跨计算机或通过IPC在同一台计算机上交换消息。 消息流可以由模块记录到持久性存储中,... -
UDP单播发送与接收.c
2019-07-03 16:09:51UDP单播,发送与接收(代码)详细介绍。单播流程:主机A向主机B发送UDP数据报,发送的目的IP为192.168.1.151,端口为 80,此数据经过UDP层、IP层,到达数据链路层,数据在整个以太网上传播。 -
UDP单播 组播 广播 区别及简单实现
2020-04-22 16:40:20udp单播: 单播只能是发送方往接收方指定的IP 端口发送数据 组播需具备的条件 1、接收方设置组播属性及组播号 2、发送方往接收方定义的组播地址发送 3、服务器客户端端口号需要一致 广播需具备的条件 1、接收方...无论是tcp还是udp 服务器都必须绑定prot、Ip,客户端可以有选择性。
udp单播: 单播只能是发送方往接收方指定的IP 端口发送数据
组播需具备的条件 1、接收方设置组播属性及组播号 2、发送方往接收方定义的组播地址发送 3、服务器客户端端口号需要一致
广播需具备的条件 1、接收方设置广播属性 2、发送方往接收方定义的组播地址发送 3、服务器客户端端口号需要一致
组播和单播的区别:组播可以多设置一个IP(这里称为为组播地址224打头的),发送方除了可以往接收方绑定的IP发送,也可以 往接收方设置的组播ip发送数据。
组播和广播的区别:广播需要设置启动接收广播属性,发送方除了可以往接收方绑定的IP发送,也可以往255同网段IP发送。这三种udp模型 客户端的实现没有区别,区别仅仅在于发送的网络IP不一样
广播是不会被路由器转发的,特点局域网通信,局域网游戏,客户端的统计 局域网群发等。
/------------------------------------------------------------------------------------------------------------------------------------------------------------------------
udp unicast server code
/------------------------------------------------------------------------------------------------------------------------------------------------------------------------
/*udp和tcp客户端其实都可以绑定自身的IP端口也可以不绑定,
不绑定的话系统会为你默认分配,而服务器则必须绑定端口 IP*/#include <Winsock2.h>
#include <iostream>
#include <thread>#pragma comment(lib, "Ws2_32.lib")
using namespace std;
int main(void)
{
/* 初始化winsock2库 */
//Step 0. Initialize winsock2 library...
WSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
return 1;
}// Step 1. Ask system for a socket.this socket is waiter
SOCKET sockServer = ::socket(PF_INET, SOCK_DGRAM, 0);if (sockServer == INVALID_SOCKET)
{
return 1;
}//Step 2. bind the socket to a local address and port.接待套接字
sockaddr_in addrServer = { 0 };
addrServer.sin_family = AF_INET;
addrServer.sin_addr.S_un.S_addr = inet_addr("88.88.106.134");
addrServer.sin_port = 30001;
if (::bind(sockServer, reinterpret_cast<const sockaddr*>(&addrServer),
sizeof addrServer) == SOCKET_ERROR)
{
return 1;
}char buf[100] = { 0 };
sockaddr_in addrClient;
int iSize = sizeof(addrClient);//recvfrom是阻塞的
int iResult = recvfrom(sockServer, buf, 100, 0, reinterpret_cast<sockaddr*>(&addrClient), &iSize);
closesocket(sockServer);
WSACleanup();
return 0;
}/------------------------------------------------------------------------------------------------------------------------------------------------------------------------
udp unicast Client code
/------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#include <Winsock2.h>
#include <iostream>
#include <thread>#pragma comment(lib, "Ws2_32.lib")
using namespace std;
int main(void)
{
/* 初始化winsock2库 */
//Step 0. Initialize winsock2 library...
WSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
return 1;
}// Step 1. Ask system for a socket.this socket is waiter
SOCKET sock2Server = ::socket(PF_INET, SOCK_DGRAM, 0);if (sock2Server == INVALID_SOCKET)
{
return 1;
}//绑定自己的port 客户端也可以绑定自己的port ip 指定数据从什么端口出去
//sockaddr_in addrBind = { 0 };
//addrBind.sin_family = AF_INET;
//addrBind.sin_addr.S_un.S_addr = inet_addr("88.88.106.134");
//addrBind.sin_port = 30002;
//if (::bind(sock2Server, reinterpret_cast<const sockaddr*>(&addrBind),
// sizeof addrBind) == SOCKET_ERROR)
//{
// return 1;
//}//设置接收方的port ip 下面的端口 ip需要和服务器一致
sockaddr_in addrServer = { 0 };
addrServer.sin_family = AF_INET;
addrServer.sin_addr.S_un.S_addr = inet_addr("88.88.106.134");
addrServer.sin_port = 30001;sendto(sock2Server, "hello", 6, 0, reinterpret_cast<sockaddr*>(&addrServer), sizeof(addrServer));
closesocket(sock2Server);
WSACleanup();
return 0;
}/------------------------------------------------------------------------------------------------------------------------------------------------------------------------
udp muticast server code
/------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#include <Winsock2.h>
#include <iostream>
#include <thread>
#include<Ws2tcpip.h> //需要加上此头文件
#pragma comment(lib, "Ws2_32.lib")using namespace std;
int main(void)
{
/* 初始化winsock2库 */
//Step 0. Initialize winsock2 library...
WSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
return 1;
}// Step 1. Ask system for a socket.this socket is waiter
SOCKET sockServer = ::socket(PF_INET, SOCK_DGRAM, 0);if (sockServer == INVALID_SOCKET)
{
return 1;
}//Step 2. bind the socket to a local address and port.接待套接字
sockaddr_in addrServer = { 0 };
addrServer.sin_family = AF_INET;
addrServer.sin_addr.S_un.S_addr = inet_addr("88.88.106.134");
addrServer.sin_port = 30001;
if (::bind(sockServer, reinterpret_cast<const sockaddr*>(&addrServer),
sizeof addrServer) == SOCKET_ERROR)
{
return 1;
}//设置接收组播属性
ip_mreq mrq;
mrq.imr_multiaddr.S_un.S_addr = inet_addr("224.0.0.11");//设置组播地址 满足前面是224即可224.0.0.1不能用
mrq.imr_interface.S_un.S_addr = 0; //设置自动选择网卡上面接收组播if (setsockopt(sockServer, IPPROTO_IP, IP_ADD_MEMBERSHIP, reinterpret_cast<const char*>(&mrq), sizeof(mrq)) == SOCKET_ERROR)
{
return 1;
}
char buf[100] = { 0 };
sockaddr_in addrClient;
int iSize = sizeof(addrClient);int iResult = recvfrom(sockServer, buf, 100, 0, reinterpret_cast<sockaddr*>(&addrClient), &iSize);
closesocket(sockServer);
WSACleanup();
return 0;
}/------------------------------------------------------------------------------------------------------------------------------------------------------------------------
udp muticast client code
/------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#include <Winsock2.h>
#include <iostream>
#include <thread>#pragma comment(lib, "Ws2_32.lib")
using namespace std;
int main(void)
{
/* 初始化winsock2库 */
//Step 0. Initialize winsock2 library...
WSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
return 1;
}
SOCKET sock2Server = ::socket(PF_INET, SOCK_DGRAM, 0);if (sock2Server == INVALID_SOCKET)
{
return 1;
}
//设置接收方的port ip 下面的端口
sockaddr_in addrServer = { 0 };
addrServer.sin_family = AF_INET;
//点对点的也可以
//addrServer.sin_addr.S_un.S_addr = inet_addr("88.88.106.134");
//往服务器组播地址发也可以,相比单播多一个选择性
addrServer.sin_addr.S_un.S_addr = inet_addr("224.0.0.11");
addrServer.sin_port = 30001;sendto(sock2Server, "hello", 6, 0, reinterpret_cast<sockaddr*>(&addrServer), sizeof(addrServer));
closesocket(sock2Server);
WSACleanup();
return 0;
}/------------------------------------------------------------------------------------------------------------------------------------------------------------------------
udp broadcast server code
/------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//具备广播的条件 1、接收方设置广播属性 2、发送方往同网段的255IP地址发送 3、服务器客户端端口号需要一致
#include <Winsock2.h>
#include <iostream>
#include <thread>#pragma comment(lib, "Ws2_32.lib")
using namespace std;
int main(void)
{
/* 初始化winsock2库 */
//Step 0. Initialize winsock2 library...
WSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
return 1;
}// Step 1. Ask system for a socket.this socket is waiter
SOCKET sockServer = ::socket(PF_INET, SOCK_DGRAM, 0);if (sockServer == INVALID_SOCKET)
{
return 1;
}//Step 2. bind the socket to a local address and port.接待套接字
sockaddr_in addrServer = { 0 };
addrServer.sin_family = AF_INET;
addrServer.sin_addr.S_un.S_addr = inet_addr("88.88.106.134");
addrServer.sin_port = 30001;
if (::bind(sockServer, reinterpret_cast<const sockaddr*>(&addrServer),
sizeof addrServer) == SOCKET_ERROR)
{
return 1;
}//设置接收广播属性 要设置了广播属性才可以接收广播消息
bool bEnableBroadcast = true;
if (setsockopt(sockServer, SOL_SOCKET, SO_BROADCAST, reinterpret_cast<const char*>(&bEnableBroadcast), sizeof(bEnableBroadcast)) == SOCKET_ERROR)
{
return 1;
}
char buf[100] = { 0 };
sockaddr_in addrClient;
int iSize = sizeof(addrClient);int iResult = recvfrom(sockServer, buf, 100, 0, reinterpret_cast<sockaddr*>(&addrClient), &iSize);
closesocket(sockServer);
WSACleanup();
return 0;
}/------------------------------------------------------------------------------------------------------------------------------------------------------------------------
udp broadcast client code
/------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#include <Winsock2.h>
#include <iostream>
#include <thread>#pragma comment(lib, "Ws2_32.lib")
using namespace std;
int main(void)
{
/* 初始化winsock2库 */
//Step 0. Initialize winsock2 library...
WSADATA wsaData;if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
return 1;
}// Step 1. Ask system for a socket.this socket is waiter
SOCKET sock2Server = ::socket(PF_INET, SOCK_DGRAM, 0);if (sock2Server == INVALID_SOCKET)
{
return 1;
}//广播中服务器设置了广播属性的话 下
//设置接收方的port ip 下面的端口
sockaddr_in addrServer = { 0 };
addrServer.sin_family = AF_INET;
//点对点的也可以
//addrServer.sin_addr.S_un.S_addr = inet_addr("88.88.106.134");
//往255这个网段发的话 只要是设置了广播属性的服务器都可以接收到数据
addrServer.sin_addr.S_un.S_addr = inet_addr("88.88.106.255");
addrServer.sin_port = 30001;sendto(sock2Server, "hello", 6, 0, reinterpret_cast<sockaddr*>(&addrServer), sizeof(addrServer));
closesocket(sock2Server);
WSACleanup();
return 0;
} -
UDP单播通信测试案例C#
2019-01-08 16:18:49UDP单播通信测试案例C# UDP单播 一段代码做纪念 Client // An highlighted block using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using ...UDP单播通信测试案例C#
UDP单播
一段代码做纪念
Client
// An highlighted block using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net; using System.Threading; using System.Net.Sockets; using CRC; namespace CRC { public partial class MainForm : Form { private IPEndPoint ServerInfo; private Socket ClientSocket; private EndPoint Remote; //信息接收缓存 private Byte[] MsgBuffer; //信息发送存储 private Byte[] MsgSend; byte[] data = new byte[1024]; string input, stringData; private Thread CThread;//服务端运行的线程 public MainForm() { InitializeComponent(); } private void MainForm_Load(object sender, EventArgs e) { //this.CmdSend.Enabled = false; //this.CmdExit.Enabled = false; MsgBuffer = new Byte[65535]; MsgSend = new Byte[65535]; //允许子线程刷新数据 CheckForIllegalCrossThreadCalls = false; Userport.Text = "6888"; UserIP.Text = "192.168.10.4"; //127.0.0.1是回环地址,用于测试本机内连接 //192.168.10.4用来发到其他的主机上 } bool flag = true;//定义一个bool变量,标识是否接收数据 Thread thread;//创建线程对象 UdpClient udp; private void CmdEnter_Click(object sender, EventArgs e) { this.CmdEnter.Enabled = false; this.CmdExit.Enabled = true; //设置服务IP,设置TCP端口号 IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(this.UserIP.Text), 6888); //定义网络类型,数据连接类型和网络协议UDP Socket ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); string welcome = "Hello! "; data = Encoding.Unicode.GetBytes(welcome); ClientSocket.SendTo(data, data.Length, SocketFlags.None, ipep); IPEndPoint sder = new IPEndPoint(IPAddress.Any, 0); EndPoint Remote = (EndPoint)sder; data = new byte[1024]; //对于不存在的IP地址,加入此行代码后,可以在指定时间内解除阻塞模式限制 //server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 100); int recv = ClientSocket.ReceiveFrom(data, ref Remote); this.ReceiveMsg.AppendText("Message received from "+Remote.ToString()); this.ReceiveMsg.AppendText(Encoding.Unicode.GetString(data, 0, recv)); flag = true;//标识接收数据 thread = new Thread(() =>//新开线程,执行接收数据操作 { while (flag)//如果标识为true { try { input = "123456789"; ClientSocket.SendTo(Encoding.Unicode.GetBytes(input), Remote); data = new byte[1024]; recv = ClientSocket.ReceiveFrom(data, ref Remote); stringData = Encoding.Unicode.GetString(data, 0, recv); this.ReceiveMsg.AppendText(stringData+"\n"); string OnePareStr = stringData.Substring(0,4); string TwoPareStr = stringData.Substring(4,4); string ThreePareStr = stringData.Substring(8, 4); string FourPareStr = stringData.Substring(12, 4); string FivePareStr = stringData.Substring(16, 4); string deData = Decode(OnePareStr, TwoPareStr, ThreePareStr, FourPareStr, FivePareStr); this.ReceiveMsg.AppendText(deData + "\n"); } catch (Exception ex) { MessageBox.Show(ex.Message);//错误提示 } //Thread.Sleep(2000);//线程休眠2秒 } }); thread.Start();//启动线程 } private string Decode(string onePareStr, string twoPareStr, string threePareStr, string fourPareStr, string fivePareStr) { string mycode, myc0, myc1, myc2, myc3, myc4; Int16 id0, id1, id2, id3, id4; id0=System.Convert.ToInt16(onePareStr, 16); id1=System.Convert.ToInt16(twoPareStr, 16); id2=System.Convert.ToInt16(threePareStr, 16); id3=System.Convert.ToInt16(fourPareStr, 16); id4=System.Convert.ToInt16(fivePareStr, 16); switch (id0){ case 2: myc0 = "进站触发"; break; default: myc0 = ""; break; } switch (id1) { case 1: myc1 = "阎村东"; break; default: myc1 = "阎村东"; break; } switch (id2) { case 1: myc2 = "阎村东"; break; default: myc2 = "阎村东"; break; } switch (id3) { case 2: myc3 = "紫草坞"; break; default: myc3 = "紫草坞"; break; } switch (id4) { case 20: myc4 = "燕山"; break; default: myc4 = "燕山"; break; } mycode = myc0+ ",起始站" + myc1 + ",当前站" + myc2 + ",下一站" + myc3 + ",终点站" + myc4; return mycode; } private void CmdExit_Click(object sender, EventArgs e) { ClientSocket.Close(); this.CmdEnter.Enabled = true; this.CmdExit.Enabled = false; } } }
Server
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using System.Threading; using System.Net; namespace Server { public partial class MainForm : Form { //声明将要用到的类 private IPEndPoint ServerInfo;//存放服务器的IP和端口信息 private EndPoint Remote; private Socket ServerSocket;//服务端运行的SOCKET private Thread ServerThread;//服务端运行的线程 public MainForm() { InitializeComponent(); } private void MainForm_Load(object sender, EventArgs e) { this.CmdStar.Enabled = true; this.CmdStop.Enabled = false; ServerIP.Text= "192.168.10.4"; RemoteIp.Text= "192.168.10.5"; } // udp.Connect("127.0.0.1", 6888);//127.0.0.1是回环地址,用于测试本机内连接 //udp.Connect("192.168.1.255", 6888);//192.168.10.5用来发到其他的主机上 private void CmdStar_Click(object sender, EventArgs e) { ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //提供一个 IP 地址,指示服务器应侦听所有网络接口上的客户端活动 ServerInfo = new IPEndPoint(IPAddress.Parse(this.ServerIP.Text), Convert.ToInt32(ServerPort.Text)); ServerSocket.Bind(ServerInfo);//将SOCKET接口和IP端口绑定 ServerThread = new Thread(new ThreadStart(RecieveAccept));//将接受客户端连接的方法委托给线程 ServerThread.Start();//线程开始运行 CheckForIllegalCrossThreadCalls = false;//不捕获对错误线程的调用 this.CmdStar.Enabled = false; this.CmdStop.Enabled = true; this.StateMsg.Text = "服务正在运行..." + " 运行端口:6888"; this.ClientList.Items.Add("服务于 " + DateTime.Now.ToString() + " 开始运行."); } //接受客户端连接的方法 private void RecieveAccept() { int recv; byte[] revData = new byte[1024]; byte[] sendData = new byte[1024]; //得到客户机IP IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(this.RemoteIp.Text), Convert.ToInt32(RemotePort.Text)); EndPoint Remote = ipep; recv = ServerSocket.ReceiveFrom(revData, ref Remote); receiveMsg.Items.Add("我是服务端,客户端连接成功"); receiveMsg.Items.Add(Encoding.Unicode.GetString(revData, 0, recv)); //客户机连接成功后,发送欢迎信息 string welcome = "Welcome !"; sendData = Encoding.Unicode.GetBytes(welcome); ServerSocket.SendTo(sendData, sendData.Length, SocketFlags.None, Remote); while (true) { //接受信息 recv = ServerSocket.ReceiveFrom(revData, ref Remote); receiveMsg.Items.Add(Encoding.Unicode.GetString(revData, 0, recv)); //发送信息 string recvDateSucceed = string.Format("服务器已收到."); sendData = Encoding.Unicode.GetBytes(Station_Reporting()); ServerSocket.SendTo(sendData, sendData.Length, SocketFlags.None, Remote); //设定周期 Thread.Sleep(3000);//阻止设定时间 } } private string Station_Reporting() { //0002 0001 0001 0002 0014 //进站触发(0x0002),起始站阎村东(0x0001),当前站阎村东(0x0002),下一站紫草坞(0x0014),终点站燕山(0x0014) string baowen = "00020001000100020014"; return baowen; } private void btnSend_Click(object sender, EventArgs e) { string msg = sendMsg.Text; //发送UDP数据包 Byte[] data = Encoding.Unicode.GetBytes(msg); ServerSocket.SendTo(data, Remote); ; receiveMsg.Items.Add("来自服务器的消息:" + sendMsg.Text); } private void CmdStop_Click(object sender, EventArgs e) { ServerThread.Abort();//线程终止 ServerSocket.Close();//关闭socket this.CmdStar.Enabled = true; this.CmdStop.Enabled = false; this.StateMsg.Text = "等待运行..."; this.ClientList.Items.Add("服务于 " + DateTime.Now.ToString() + " 停止运行."); } private void MainForm_FormClosed(object sender, FormClosedEventArgs e) { ServerThread.Abort();//线程终止 ServerSocket.Close();//关闭SOCKET Application.Exit(); } private void label5_Click(object sender, EventArgs e) { } } }
-
Linux C编程 socket—Udp单播
2020-02-09 18:09:57Linux C编程 socket—Udp单播Udp简介概述特点Udp单播编程(服务器和客户端基本无差别)函数介绍Udp服务器示例Udp客户端示例 Udp简介 概述 UDP 是 User Datagram Protocol 的简称, 中文名是用户数据报协议,是一个... -
netty的Udp单播、组播、广播实例+Java的Udp单播、组播、广播实例
2019-09-26 10:09:12网络上缺乏netty的udp的单播、组播案例,经过一番学习总结之后终于把这两个案例调通,下面把这两个案例的代码放在这里分享一下。 首先推荐博文: ... -
linux udp 单播组播广播实现
2016-10-27 11:43:11linux udp 单播组播广播实现 http://blog.csdn.net/zuokong/article/details/7548008 多播广播是用于建立分步式系统:例如网络游戏、ICQ聊天构建、远程视频会议系统的重要工具。使用多播广播的程序和UDP向单个介绍... -
windows下UDP单播、广播播和组播实例
2018-08-12 18:29:18windows下使用UDP的简单实例,包括单播、广播和多播的实例代码,使用VS2010编写 -
UDP单播小例子 C#
2015-08-26 13:52:04本人是C#小菜鸟,这是自己学习使用udp单播通信时调试通过的例子。 1.首先先定义UdpClient和IPEndPoint类的实例 private UdpClient m_udpClient; private IPEndPoint m_distanceHost; private IPEndPoint m_... -
Linux UDP 单播 组播 广播实现
2014-03-17 14:27:03linux udp单播 组播 广播实现 1、组播和广播需要在局域网内才能实现,另外得查看linux系统是否支持多播和广播:ifconfig UP BROADCAST MULTICAST MTU:1500 跃点数:1 说明该网卡支持 2、发送多播包的主机需要... -
UDP单播和组播使用SO_REUSEADDR 测试结果
2015-11-19 21:06:56UDP单播通信一、预置条件 A、B在同一台机器,网络中存在往A、B所在的机器的8888端口发送单播UDP数据 A:端口复用绑定在端口8888上 B:端口复用绑定在端口8888上操作步骤:(1)先启动A(2)再启动B(3)B退出预期结果:(1)A ... -
UDP 单播、广播和多播
2020-01-06 21:02:35本文转载自:... 阅读目录(Content) 一、UDP广播 二、UDP多播1、多播(组播)的概念 2、广域网的多播 三、UDP广播与单播广播与单播的比较 使用UDP协议进行信息的传... -
java udp 广播 组播_UDP 单播、广播和多播
2021-02-26 18:56:08使用UDP协议进行信息的传输之前不...单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信。单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信。... -
求教一个udp单播代码。非常感谢~急求
2016-08-24 04:51:07求教一个udp单播的收发程序参考一下~想看看怎么写的~网上没找到资料~无尽感谢~