Socket Websocket 客户端和服务端实现

news/2025/3/31 2:42:34/

最近在写一个上位机,用到了Websocket,这里就整理一下,顺便把Socket的东西也整理的了,方便以后查阅。

Socket Websocket 客户端和服务端实现

  • Socket客户端和服务端实现
    • Socket客户端
    • Socket服务端
    • 实现效果
  • Websocket 客户端和服务端实现
    • Websocket 客户端
    • Websocket 服务端
    • 实现效果
    • 参考资料

Socket客户端和服务端实现

Socket客户端

//创建负责通信的socket
Socket socketSend;
private void btnConnect_Click(object sender, EventArgs e)
{btnConnect.Enabled = false;btnStop.Enabled = true;try{//创建负责通信的socketsocketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//AddressFamily.InterNetwork表示ipv4IPAddress iPAddress = IPAddress.Parse(tbxIP.Text);//IP地址IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, Convert.ToInt32(tbxPort.Text));//端口号//获得要连接的远程服务器的IP和端口号;socketSend.Connect(iPEndPoint);ShowMess("连接成功");Thread th = new Thread(RecData);th.IsBackground = true;th.Start(socketSend);}catch (Exception ex){ShowMess(Convert.ToString(ex));}
}void RecData(object o)
{Socket socketSend = o as Socket;try{while (true){byte[] buffer = new byte[1021 * 1021 * 2];int r = socketSend.Receive(buffer);if (r == 0) break;string str = Encoding.UTF8.GetString(buffer, 0, r);ShowMess(socketSend.RemoteEndPoint.ToString() + ":" + str);}}catch (Exception ex){ShowMess(Convert.ToString(ex));}
}void ShowMess(string str)
{tbxAppend.AppendText(str + "\r\n");
}/// <summary>
/// 客户端给服务器发送消息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSend_Click(object sender, EventArgs e)
{try{string str = tbxSend.Text.Trim();byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);socketSend.Send(buffer);}catch (Exception ex){ShowMess(Convert.ToString(ex));}
}private void Form1_Load(object sender, EventArgs e)
{Control.CheckForIllegalCrossThreadCalls = false;btnStop.Enabled = false;
}private void btnStop_Click(object sender, EventArgs e)
{btnConnect.Enabled = true;btnStop.Enabled = false;socketSend.Close();ShowMess("断开连接  " + DateTime.Now);
}

在这里插入图片描述

Socket服务端

Socket socketWatch;
/// <summary>
/// 点击开始监听
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnStart_Click(object sender, EventArgs e)
{btnStart.Enabled = false;btnStop.Enabled = true;try{//当点击开始时,服务器创建一个负责监听IP地址和端口号的socket;socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);IPAddress ip = IPAddress.Parse(tbxIP.Text);IPEndPoint port = new IPEndPoint(ip, Convert.ToInt32(tbxPort.Text));//创建端口号对象//监听,绑定监听端口socketWatch.Bind(port);ShowMess("监听成功 时间:" + DateTime.Now);//设定监听队列数量socket处于监听状态socketWatch.Listen(10);Thread th = new Thread(Listen);//accept方法会阻碍主线程,所以开启新的线程;th.IsBackground = true;//将线程设置为后台线程th.Start(socketWatch);//线程等待cpu处理}catch(Exception ex){//ShowMess(Convert.ToString(ex));}
}Socket socketSend;//等待客户端的连接并创建一个负责通信的socket
/// <summary>
/// 等待客户端的连接并创建一个负责通信的socket
/// </summary>
void Listen(object o)//object 线程参数必须为object
{Socket socketWatch = o as Socket;while (true){try{//等待客户端的连接并创建一个负责通信的socketsocketSend = socketWatch.Accept();//将远程的客户端的IP和socket存入合集;dicsocket.Add(socketSend.RemoteEndPoint.ToString(), socketSend);//下拉框添加ip地址cbxIP.Items.Add(socketSend.RemoteEndPoint.ToString());ShowMess(socketSend.RemoteEndPoint.ToString() + ":连接成功");//开启一个新的线程不停接受客户端发送的数据;Thread th = new Thread(RecData);th.IsBackground = true;th.Start(socketSend);}catch (Exception ex){//ShowMess(Convert.ToString(ex));}}
}//将远程的客户端的IP和socket存入合集;
Dictionary<string, Socket> dicsocket = new Dictionary<string, Socket>();
/// <summary>
/// 服务器不停的接受客户端发来的数据
/// </summary>
/// <param name="o"></param>
void RecData(object o)
{Socket socketSend = o as Socket;while (true){try{byte[] buffer = new byte[1024 * 1024 * 2];int r = socketSend.Receive(buffer);if (r == 0) break;string str = Encoding.UTF8.GetString(buffer, 0, r);ShowMess(socketSend.RemoteEndPoint.ToString() + ":" + str);}catch (Exception ex){//ShowMess(Convert.ToString(ex));}}
}/// <summary>
/// 信息显示
/// </summary>
/// <param name="str"></param>
void ShowMess(string str)
{tbxAppend.AppendText(str + "\r\n");
}private void Form1_Load(object sender, EventArgs e)
{//允许跨线程访问Control.CheckForIllegalCrossThreadCalls = false;btnStop.Enabled = false;
}/// <summary>
/// 服务器给客户端发送数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSend_Click(object sender, EventArgs e)
{try{string str = tbxSend.Text.Trim();byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);//获取下拉框的IP地址;string ip = cbxIP.SelectedItem.ToString();//socketSend.Send(buffer);dicsocket[ip].Send(buffer);}catch (Exception ex){ShowMess(Convert.ToString(ex));}
}private void btnStop_Click(object sender, EventArgs e)
{btnStart.Enabled = true;btnStop.Enabled = false;//socketWatch.Close();socketSend.Close();cbxIP.Items.Clear();ShowMess("停止成功 时间:" + DateTime.Now);
}

在这里插入图片描述

实现效果

在这里插入图片描述

相关工程代码我放在了CSDN资源里:《Socket-Sever-Client》

Websocket 客户端和服务端实现

Websocket 客户端

工具 —>Nuget包管理 —>管理解决方案的Nuget程序包 —>搜索 WebSocket4Net ,选择WebSocket4Net,点击右侧 安装,等待安装完成,安装完成以后,项目会多出很多引用库,如下

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

public Form1()
{InitializeComponent();Control.CheckForIllegalCrossThreadCalls = false;
}private void Form1_Load(object sender, EventArgs e)
{}public static WebSocket webSocket4Net = null;
public void websocketClient()
{textBox4.AppendText("我是客户端" + "\r\n");//打印相关消息webSocket4Net = new WebSocket("ws://" + textBox1.Text.ToString() + ":" + textBox2.Text.ToString());webSocket4Net.Opened += WebSocket4Net_Opened;webSocket4Net.Error += websocket_Error;webSocket4Net.Closed += new EventHandler(websocket_Closed);webSocket4Net.MessageReceived += WebSocket4Net_MessageReceived;webSocket4Net.Open();
}private void WebSocket4Net_MessageReceived(object sender, MessageReceivedEventArgs e)
{textBox4.AppendText("服务端回复的数据:" + e.Message + "\r\n");//打印相关消息
}private void WebSocket4Net_Opened(object sender, EventArgs e)
{textBox4.AppendText("客户端连接成功!发送数据中..." + "\r\n");//打印相关消息webSocket4Net.Send("来自客户端,准备发送数据!" + "\r\n");//向服务端发送数据
}private void websocket_Error(object sender, EventArgs e)//webSocket错误响应
{textBox4.AppendText("WebSocket错误" + "\r\n");Thread.Sleep(5000);//等待一段时间后重新连接if (webSocket4Net.State != WebSocketState.Open && webSocket4Net.State != WebSocketState.Connecting){websocketClient();}
}private void websocket_Closed(object sender, EventArgs e)//webSocket关闭响应
{textBox4.AppendText("WebSocket已关闭" + "\r\n");Thread.Sleep(5000);//等待一段时间后重新连接if (webSocket4Net.State != WebSocketState.Open && webSocket4Net.State != WebSocketState.Connecting){websocketClient();}
}private void button2_Click(object sender, EventArgs e)//发送按钮
{webSocket4Net.Send(textBox3.Text.ToString());
}private void button1_Click(object sender, EventArgs e)//连接按钮
{websocketClient();
}

在这里插入图片描述

Websocket 服务端

工具 —>Nuget包管理 —>管理解决方案的Nuget程序包 —>搜索 SuperWebSocket ,选择SuperWebSocketNETServer,点击右侧 安装,等待安装完成,安装完成以后,项目会多出很多引用库,如下
在这里插入图片描述

public Form1()
{InitializeComponent();
}private void websocketServer()
{textBox1.AppendText("我是服务端" + "\r\n");//打印相关消息WebSocketServer webSocketServer = new WebSocketServer();webSocketServer.NewSessionConnected += WebSocketServer_NewSessionConnected;webSocketServer.NewMessageReceived += WebSocketServer_NewMessageReceived;webSocketServer.SessionClosed += WebSocketServer_SessionClosed;if (!webSocketServer.Setup("127.0.0.1", 1234)){textBox1.AppendText("设置服务监听失败!" + "\r\n");}if (!webSocketServer.Start()){textBox1.AppendText("启动服务监听失败!" + "\r\n");}textBox1.AppendText("启动服务监听成功!" + "\r\n");
}private void WebSocketServer_NewSessionConnected(WebSocketSession session)
{textBox1.AppendText("欢迎客户端: 加入" + "\r\n");//SendToAll(session, msg);
}private void WebSocketServer_NewMessageReceived(WebSocketSession session, string value)
{textBox1.AppendText("服务端收到客户端的数据 ==》" + value + "\r\n");//SendToAll(session, value);
}private void WebSocketServer_SessionClosed(WebSocketSession session, SuperSocket.SocketBase.CloseReason value)
{textBox1.AppendText("客户端:关闭,原因:" + "\r\n");//SendToAll(session, msg);
}private void Form1_Load(object sender, EventArgs e)
{Control.CheckForIllegalCrossThreadCalls = false;websocketServer();
}

在这里插入图片描述

实现效果

在这里插入图片描述

相关工程代码我放在了CSDN资源里:《C# 实现的WebSocket服务端和客户端》

参考资料

【计算机网络 13】使用C#实现websocket服务端与客户端通信


http://www.ppmy.cn/news/4161.html

相关文章

一维数组定义遍历

一维数组&#xff0c;是由数字组成的以单纯的排序结构排列的结构单一的数组&#xff0c;是计算机程序中最基本的数组。二维及多维数组可以看作是一维数组的多次叠加产生的。 在程序中可以使用下标变量&#xff0c;即说明这些变量的整体为数组&#xff0c;数组中的每个变量的数…

大数据Kudu(八):Kudu与Impala整合

文章目录 Kudu与Impala整合 一、​​​​​​​Kudu与Impala整合配置

LeetCode HOT 100 —— 297.二叉树的序列化与反序列化

题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作&#xff0c;进而可以将转换后的数据存储在一个文件或者内存中&#xff0c;同时也可以通过网络传输到另一个计算机环境&#xff0c;采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与反序列化。…

OM6621系列国产M4F内核低功耗BLE5.1大内存SoC蓝牙芯片

目录OM6621系列简介OM6621P系列芯片特性应用领域OM6621系列简介 随着5G与物联网时代的到来&#xff0c;智慧城市、电动出行、智能家居、可穿戴设备等应用高速发展&#xff0c;低功耗蓝牙技术在近几年智能化浪潮中的地位也尤为重要。OM6621系列的开发即是为解决国内低功耗蓝牙应…

企业员工电脑软件应该如何选择?

现在很多企业都希望购买上网行为管理软件&#xff0c;因为这种软件可以控制员工的行为&#xff0c;可以避免员工在工作的时候做与工作无关的事情。但是这种软件应该如何采购&#xff0c;很多企业都搞不懂&#xff0c;现在就来看看在购买上网行为管理软件时应该如何选择。 1. 监…

存储mybatis的xml标签,动态sql 查询

前言&#xff1a; 通过表动态存储mybatis 的xml标签&#xff0c;通过动态sql 入参查询&#xff0c;方便更新查询逻辑&#xff0c;无需发版即可&#xff1b;&#xff08;当前用的是 mybatis-plus &#xff0c;db用的是oracle【这个无所谓】&#xff09; 注意事项&#xff1a;这…

测试人必备的Linux常用命令大全...【全网最全面整理】

Linux常用命令大全&#xff08;非常全&#xff01;&#xff01;&#xff01;&#xff09; 最近都在和Linux打交道&#xff0c;感觉还不错。我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制&#xff0c;当然&#xff0c;这也是很多人喜欢linux的原因&#xff0c…

Java安全--CC4

CC4 环境提一小嘴&#xff1a; CC4利用的是commons-collections4&#xff0c;所以我们需要导入新的依赖&#xff0c;地址&#xff1a;https://mvnrepository.com/artifact/org.apache.commons/commons-collections4/4.0 我们先来关注一下利用链&#xff1a; 后半段是一样的&am…