Socket Websocket 客户端和服务端实现

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

Socket客户端和服务端实现

Socket客户端

//创建负责通信的socket
Socket socketSend;
private void btnConnect_Click(object sender, EventArgs e)
{
    btnConnect.Enabled = false;
    btnStop.Enabled = true;
    try
    {
        //创建负责通信的socket
        socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//AddressFamily.InterNetwork表示ipv4
        IPAddress 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
        {
            //等待客户端的连接并创建一个负责通信的socket
            socketSend = 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服务端与客户端通信

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值