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去博客园了。

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

  1. 【Linux】socket网络编程之服务器与客户端的数据交互

    [Linux]socket网络编程之服务器与客户端的数据交互 前言参考 argc !=2是什么意思 inet pton函数 对stdin,stdout 和STDOUT_FILENO,STDIN_FIL ...

  2. BIO,Socket网络编程入门代码示例,NIO网络编程入门代码示例,AIO 网络编程

    BIO,Socket网络编程入门代码示例 1.BIO服务器端程序 package cn.itcast.bio;import java.io.InputStream; import java.io.Ou ...

  3. 视频教程-C++socket网络编程--http服务器(支持php)实战教学视频-C/C++

    C++socket网络编程--http服务器(支持php)实战教学视频 夏曹俊:南京捷帝科技有限公司创始人,南京大学计算机硕士毕业,有15年c++跨平台项目研发的经验,领导开发过大量的c++虚拟仿真, ...

  4. Java网络编程(一)网络编程入门知识

    文章目录 第一章 Java网络编程入门 1.前言 1.1 进程之间的通信 1.2 计算机网络概念 1.3 网络模型之OSI参考模型 1.4 TCP/IP参考模型和TCP/IP协议 1.4.1 模型解析 ...

  5. python编程入门与案例详解-Pythony运维入门之Socket网络编程详解

    Socket是什么? Socket 是电脑网络中进程间数据流的端点Socket 是操作系统的通信机制应用程序通过Socket进行网络数据的传输 首先,简单了解一下TCP通信过程: TCP三次握手(面试 ...

  6. TCP原理,Socket与网络编程入门

    TCP原理,Socket与网络编程入门 开篇 从互联网的诞生以来,网络程序逐渐普及.计算机网络将各个计算机连接到一起使它们可以通信.在现代,网络已成为我们十分重要的一部分.这次不搞些费脑子的东西,就让 ...

  7. 脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?

    转载自 http://www.52im.net/thread-1732-1-1.html 1.引言 本文接上篇<脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手>,继续脑残式 ...

  8. 【网络编程入门】使用socket在Linux下实现即时通信软件

    使用socket在Linux下实现即时通信软件 在前一篇文章中讲到了如何使用winsock:[网络编程入门]在C++中使用Windows TCP Sockets,也算是勉强入门了吧,接下来自己写一下在 ...

  9. Java网络编程入门,包含网络相关概念、InetAddress类、套接字Socket、网络上传和下载文件等

    Java学习-11-韩顺平老师 Java-网络编程入门 目录: 01-网络相关概念 02-InetAddress类 03-套接字Socket 04-网络上传和下载文件 05-UDP网络编程 网络编程相 ...

最新文章

  1. mysql 非等值条件 索引_mysql 索引学习--多条件等值查询,顺序不同也能应用联合索引啦...
  2. python paramiko模块中设置执行命令超时值
  3. 语音数据采集-实时语音数据可视化
  4. 成员变量的初始化和内存中的运行机制
  5. 黑匣子解密要多久_科普|飞机上的黑匣子内置电池可工作多久?
  6. 阿里腾讯决战ToB“操作系统”
  7. 《梦断代码》读后感2
  8. h5页面在ios机上禁止长按复制
  9. PAIP.http post 400错误
  10. Oracle数据库学习笔记
  11. Tomcat 发布时war解压
  12. 计算机0x50006错误,你们安装win8使用崩溃多少次
  13. 妖魔复苏:天师下山!开局传承天师度(二)
  14. ppt怎么修改页面布局
  15. Sentence Centrality Revisited for Unsupervised Summarization
  16. <dl>、<dt>、<dd> 的使用
  17. Leecode 1658. 将 x 减到 0 的最小操作数 滑动窗口
  18. Henry捡钱 Java 动态规划
  19. Educoder计算机数据表示实验(HUST)第5关:16位海明编码电路设计
  20. TeXworks编辑器的编辑区的中文显示问题

热门文章

  1. drawio便笺本同步到云端多浏览器
  2. 国产手机品牌才发现,没有国内消费者支持它们什么也不是
  3. VScode 配置 Java 开发环境 (VSCode 天下第一)
  4. datatables html定义,DataTables表格插件使用说明
  5. VSCode编译调试复杂C/C++项目
  6. 【JZOJ A组】跑商
  7. Ubuntu20.04安装配置运行DynaSLAM
  8. 论文大讲堂-2014-IJCV-A Comprehensive Survey to Face Hallucination-Part1
  9. Premiere企业营销品牌形象宣传视频 PR模板
  10. Python-PyMysql详解