C# Socket网络编程入门(服务器与客户端通信,客户端与客户端通信)

article/2025/9/26 14:45:26

WebSocket全双工通讯链接,用于前台和后台自由发送信息

一.效果展示:

效果描述:
1.服务器充当管理员,给所有人发送信息,除服务器以外其他人都能接受到。
2.其他用户发送信息除自己以外其他用户和管理员全能接受到。
在这里插入图片描述

注意:图中打码处为服务器IP和端口,每个电脑都只能访问自己的服务器以及端口,用cmd打开管理员命令窗口,用如下代码 可以查看本机所有IP和端口

netstat -a
//或者
netstat -an

在这里插入图片描述

二.服务器代码:

	public partial class MainForm : Form
{List<Socket> ClientProxSocketList = new List<Socket>();public MainForm(){InitializeComponent();}Socket proxSocket;//点击启动按钮private void btn_Start_Click(object sender, EventArgs e){//1  创建SocketSocket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//2 绑定端口Ipsocket.Bind(new IPEndPoint(IPAddress.Parse(txt_Ip.Text),int.Parse(txt_Port.Text)));//3 开启监听socket.Listen(1000);  //链接:最大接收请求数,超出返回错误信息//4 开始接收客户端的链接ThreadPool.QueueUserWorkItem(new WaitCallback(this.AcceptClientConnect),socket);}//将远程连接的客户端的IP地址和Socket存入集合中Dictionary<string, Socket> dicSocket = new Dictionary<string, Socket>();public void AcceptClientConnect(object socket){var serverSocket = socket as Socket;this.AppendTextToTxtLog("服务器开始接受客户端的链接。");while (true){//负责跟客户通信的SocketproxSocket = serverSocket.Accept();//将远程连接的客户端的IP地址和Socket存入集合中dicSocket.Add(proxSocket.RemoteEndPoint.ToString(),proxSocket);//将远程连接的客户端IP地址和端口存储下拉框中//cboUsers.Items.Add(proxSocket.RemoteEndPoint.ToString());this.AppendTextToTxtLog(string.Format("客户端:{0}链接上了",proxSocket.RemoteEndPoint.ToString()));ClientProxSocketList.Add(proxSocket);//不停的接收当前链接的客户端发送的信息// proxSocket.Receive();ThreadPool.QueueUserWorkItem(new WaitCallback(ReceiveData),proxSocket);}}//接收客户端的消息public void ReceiveData(object socket){var proxSocket = socket as Socket;byte[] data = new byte[1024 * 1024 * 2];while (true){int len = 0;try{len = proxSocket.Receive(data, 0, data.Length, SocketFlags.None);}catch (Exception){//异常退出AppendTextToTxtLog(string.Format("客户端:{0}正常退出", proxSocket.RemoteEndPoint.ToString()));ClientProxSocketList.Remove(proxSocket);return;}if(len <= 0){//客户端正常退出AppendTextToTxtLog(string.Format("客户端:{0}正常退出", proxSocket.RemoteEndPoint.ToString()));ClientProxSocketList.Remove(proxSocket);return;//让方法结束,终结当前接受客户端数据的异步线程}//把接收到的数据放到文本框中string str =  Encoding.UTF8.GetString(data,0,len);AppendTextToTxtLog(string.Format("接收到客户端:{0}的消息是:{1}",proxSocket.RemoteEndPoint.ToString(),str));//服务器转发信息,除发送方以外,转发信息byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);foreach (var item in dicSocket){if (item.Key != proxSocket.RemoteEndPoint.ToString())item.Value.Send(buffer);}}}//往日志的文本框上追加数据public void AppendTextToTxtLog(string txt){if (txt_Cont.InvokeRequired){txt_Cont.Invoke(new Action<string>(s =>{this.txt_Cont.Text = string.Format("{0}\r\n{1}", s, txt_Cont.Text);}),txt);}else{this.txt_Cont.Text = string.Format("{0}\r\n{1}", txt, txt_Cont.Text);}}//服务器给客户端发送信息private void btn_Send_Click(object sender, EventArgs e){#region//foreach (var proxSocket in ClientProxSocketList)//{//    if (proxSocket.Connected)//    {//        byte[] data = Encoding.Default.GetBytes(txt_Msg.Text);//        proxSocket.Send(data, 0, data.Length, SocketFlags.None);//    }//}#endregionstring str = txt_Msg.Text;byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);//获取用户在下拉框中选择的IP地址//string ip = cboUsers.SelectedItem.ToString();foreach (var item in dicSocket){//if(item.Key != proxSocket.RemoteEndPoint.ToString())item.Value.Send(buffer);}//proxSocket.Send(buffer);}
}

三.客户端代码:

 public partial class ClientForm : Form
{public ClientForm(){InitializeComponent();}Socket socketSend;//点击连接private void btn_Link_Click(object sender, EventArgs e){//创建负责通信的SocketsocketSend = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);IPAddress ip = IPAddress.Parse(lab_Ip.Text);IPEndPoint point = new IPEndPoint(ip,Convert.ToInt32(lab_Port.Text));socketSend.Connect(point);ShowMsg("连接成功");//开启一个线程不停接受服务器发送来的信息Thread th = new Thread(Recive);th.IsBackground = true;th.Start();}//不停接受服务器发来的消息void Recive(){while (true){byte[] buffer = new byte[1024 * 1024 * 3];//实际接受到的有效字节int r = socketSend.Receive(buffer);if(r <= 0){break;}string s = Encoding.UTF8.GetString(buffer,0,r);ShowMsg(socketSend.RemoteEndPoint+":"+s);}}void ShowMsg(string str){txt_Cont.AppendText(str + "\r\n");}//点击发送按钮,客户端给服务器发送消息private void btn_Send_Click(object sender, EventArgs e){string str = txt_Msg.Text.Trim();byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);socketSend.Send(buffer);}
}

四.总结&猜想

这里的服务器转发只用了一个Dictionary存储了所有连接服务器的Socket。如果要做一个更好的单独会话,就在数据库好友的链接表里面,记录好端口和IP,每次选择好友查询数据库,单独发送给好友

五.学习链接:

CSDN C# Socket 会话思路与实现

BiLibili Winform应用程序_多线程和socket网络编程

在这里插入图片描述

吐槽:
就很怪,现在发布文章,字数不多还提示推荐受影响。。。
CSDN路走窄了啊,浓缩的都是精华好吧。
再这样下去,我只能放弃CSDN去博客园了。

吐槽:
就很怪,现在发布文章,字数不多还提示推荐受影响。。。
CSDN路走窄了啊,浓缩的都是精华好吧。
再这样下去,我只能放弃CSDN去博客园了。

吐槽:
就很怪,现在发布文章,字数不多还提示推荐受影响。。。
CSDN路走窄了啊,浓缩的都是精华好吧。
再这样下去,我只能放弃CSDN去博客园了。

吐槽:
就很怪,现在发布文章,字数不多还提示推荐受影响。。。
CSDN路走窄了啊,浓缩的都是精华好吧。
再这样下去,我只能放弃CSDN去博客园了。


http://chatgpt.dhexx.cn/article/Z2MYEoPV.shtml

相关文章

TCP/IP网络编程 学习笔记_1 --网络编程入门

前言&#xff1a;这个系列网络编程教程实例代码是在Xcode上运行的&#xff0c;MacOSX&#xff0c;是一个基于UNIX核心的系统&#xff0c;所以基于Linux的网络编程代码一般可以直接在Xcode上运行&#xff0c;如果要移植到Windows其实就只需要稍微改下&#xff0c;本章下面有讲Wi…

Scratch编程入门

Scratch编程入门 Scratch是麻省理工学院的“终身幼儿园团队”&#xff08;Lifelong Kindergarten Group&#xff09;开发的图形化编程工具&#xff0c;免费。2019年1月2日正式发布, Scratch3.0。 Scratch把计算机执行的指令、逻辑变成了小朋友能看明白的“积木”&#xff0c;…

C语言网络编程——基础

OSI七层参考模型 是理想化的并没有完全实现的模型。 应用层 提供响应的应用服务 表示层 数据的表示和加密 会话层 建立会话关系 传输层 通过传输协议传输数据 网络层 实现跨子网通信&#xff0c;路由转发&#xff0c;维护路由表。 数据链路层 实现以太网内数据帧的转发 …

matlab 神经网络编程入门系列(1)

本文主要内容包括&#xff1a; (1) 介绍神经网络基本原理&#xff0c;(2) Matlab实现前向神经网络的方法 。 第0节、引例 本文以Fisher的Iris数据集作为神经网络程序的测试数据集。 由于英文的类无法识别&#xff0c;故需要把对应的类用数字标识&#xff0c;数据集变成&…

WinPcap网络编程入门——0. 环境配置及系列介绍

WinPcap网络编程入门——0. 环境配置及系列介绍 系列教程章节直达&#xff1a; Winpcap网络编程入门——1. 获取设备列表&#xff1b; 说明&#xff1a;本教程适用于网络编程开发人员入门&#xff0c;将从底层分析 WinPcap 的执行过程&#xff0c;结合一些实际用例来学习 WinP…

Java核心类库之(网络编程:网络编程入门、UDP通信程序、TCP通信程序)

目录 1 网络编程入门1.1 网络编程概述1.2 网络编程三要素1.3 IP地址1.4 InetAddress的使用1.5 端口1.6 协议 2 UDP通信程序2.1 UDP通信原理2.2 UDP发送数据2.3 UDP接收数据2.4 范例 3 TCP通信程序3.1 TCP通信原理3.2 TCP发送数据3.3 TCP接收数据3.4 案例3.4.1 练习一&#xff1…

Java网络编程入门(软件结构、网络通信协议、网络编程三要素)

文章目录 &#x1f415;软件结构&#x1f436;网络通信协议&#x1f981;协议分类&#x1f405;网络编程三要素&#x1f406;协议&#x1f40e;IP地址&#x1f98c;端口号 &#x1f415;软件结构 C/S结构 &#xff1a;全称为Client/Server结构&#xff0c;是指客户端和服务器结…

黑客编程入门 之 网络编程入门

网络编程入门 前言Socket技术详细介绍Socket 编程所需函数服务器/客户 代码 前言 “任何职业都可以成为黑客。你可以是一个木匠黑客。不一定是高科技。只要与技能有关&#xff0c;并且倾心专注于你正在做的事情&#xff0c;你就可能成为黑客。” ——引自《黑客伦理与信息时代精…

WinPcap网络编程入门——1. 获取设备列表

WinPcap网络编程入门——1. 获取设备列表 系列教程章节直达&#xff1a; Winpcap网络编程入门——1. 获取设备列表&#xff1b; 上节中我们简单介绍了 WinPcap 的相关资料&#xff0c;配置好了开发环境&#xff0c;现在就让我们正式开始网络编程开发吧&#xff01; 1. 基本开…

网络编程入门(代码很详细)

网络编程 1.1概述 计算机网络&#xff1a;计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算…

网络编程——(1)网络编程入门

一、软件架构 1.1C/S结构&#xff1a; 全称Client/Server结构&#xff0c;是指客户端和服务器结构。常见的程序有QQ、迅雷等。 1.2 B/S结构&#xff1a; 全称为Browser/Server结构&#xff0c;是指浏览器和服务器结构。常见浏览器有谷歌、火狐等。 两种架构各有优势&#xf…

网络编程入门

1.网络编程入门 1.1网络编程概述 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算机系统 网…

线性代数学习笔记——第六讲——矩阵的转置

1. 矩阵转置的定义&#xff08;矩阵的行和列互换位置&#xff09; 2. 矩阵转置的性质之一&#xff1a;矩阵转置一次后再转置一次&#xff0c;等于矩阵自身&#xff08;有点像一个两状态开关&#xff0c;在开与关之间来回切换&#xff09; 3. 对称矩阵的充要条件是矩阵转置一次后…

转置矩阵、对称矩阵、反对称矩阵以及向量的反对称矩阵

一、转置矩阵 假设矩阵 A 如下表示&#xff1a; 则其转置矩阵表示为&#xff1a; 二、对称矩阵 若矩阵 B 与其转置矩阵相等&#xff0c;则称矩阵 B 为对称矩阵&#xff0c;如&#xff1a; 三、反对称矩阵 若矩阵 C 与其转置矩阵取负后相等&#xff0c;则称矩阵 C 为反对称矩…

Java编程之转置矩阵

一、题目 利用随机函数产生36个10~30之间的整数给一个6*6的矩阵赋值。 &#xff08;1&#xff09;求最大元素&#xff0c;并指出其在矩阵中的所有出现位置&#xff1b; &#xff08;2&#xff09;求该矩阵的转置矩阵。 二、实验代码 package fighting; import java.util.Rand…

FPGA 矩阵转置

这里写目录标题 1 功能2 开发环境3 框架4 转置公式5 Simulation第一部分第二部分第三部分 6 Matlab代码产生FIFO数据产生转置矩阵 7 HDL仿真文件顶层文件FIFO顶层文件FIFO读FIFO写RAM顶层文件 8 IP配置FIFORAMROM 9 Reference 1 功能 通过tb读取本地数据保存到FIFO&#xff0c…

MATLAB的转置

小席的碎碎叨&#xff1a;   以前处理的数据通常都是实数矩阵&#xff0c;一直认为MATLAB中的转置可用实现&#xff0c;并没有发现有什么不对。但是&#xff0c;这段时间在做线性调频信号的干扰抑制的仿真&#xff0c;其信号矩阵都是复数矩阵&#xff0c;依然在需要转置的时候…

矩阵转置(transpose、T)

1.T T 适用于一、二维数组的转置 transpose 适用于高维数组&#xff0c;需要用到一个由轴编号组成的元组&#xff0c;才能进行转置 In [1]: import numpy as npIn [2]: arr np.arange(20).reshape(4,5)#生成一个4行5列的数组In [3]: arr Out[3]: array([[ 0, 1, 2, 3, 4]…

线性代数:转置矩阵(matrix transpose)和逆矩阵(matrix inverse)

这一篇是为了后面着色效果的数学基础做积累&#xff0c;之前我们使用矩阵的大部分情况都是直接的仿射空间变换&#xff0c;就是仿射空间A变换到仿射空间B&#xff0c;使用矩阵也都是如下&#xff1a; 矩阵T*齐次坐标V 齐次坐标V 其计算细节也就是矩阵行与向量列的点积&#xf…

转置矩阵(matrix transpose)和逆矩阵(matrix inverse)的相关公式

转载自: https://blog.csdn.net/yinhun2012/article/details/84236202 这一篇是为了后面着色效果的数学基础做积累&#xff0c;之前我们使用矩阵的大部分情况都是直接的仿射空间变换&#xff0c;就是仿射空间A变换到仿射空间B&#xff0c;使用矩阵也都是如下&#xff1a; 矩阵T…