C#基于scoket简易聊天室代码阅读笔记
代码自https://blog.csdn.net/scimence/article/details/52957829(非常感谢博主,代码清晰完整又简洁)
- IPAddress.Parse()将 IP 地址字符串转换为 IPAddress 实例。
- EndPoint(端点):由IP地址和端口号构成,端口对应进程。这两个组合起来可以唯一的标识网络中某台主机上的某一个进程。这样就有一个唯一的身份标识,后面可以进行通信了
- Socket.Accept ():Accept 以同步方式从侦听套接字的连接请求队列中提取第一个挂起的连接请求,然后创建并返回一个新 Socket,可以调用 RemoteEndPoint 方法所返回的 Socket 来标识远程主机的网络地址和端口号
- 存储连接到服务器的客户端信息:Dictionary<string, Socket> clients = new Dictionary<string, Socket>();
- C#中Dictionary的用法及用途:https://www.cnblogs.com/fire909090/p/8207239.html
- 确定是否 Dictionary<TKey, TValue> 包含指定键:ContainsKey();
- Socket.Send():将数据发送到连接 Socket;
- 获取已经从网络接收且可供读取的数据量:Socket.Available属性
- C#socket通信:https://www.cnblogs.com/sdyinfang/p/5519708.html
- C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。
过程
在服务端:
(1)声明一个套接字(称为监听套接字)Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
(2)声明一个端点(EndPoint)上面提到过Socket需要跟它绑定才能通信。IPEndPoint endPoint = new IPEndPoint(IPAddress.Loopback, 8080);
(3)设置监听队列serverSocket.Listen(100);
(4)通过Accept()方法来获取一个通信套接字(当有客户端连接时),这个方法会阻塞线程,避免界面卡死的现象,启动一个线程,把这个Accept()放在线程函数里面。
在客户端:
(1)声明一个套接字,通过connect()向服务器发起连接。
(2)通过Receive方法获取服务器发来的消息(这里同样启用一个线程,通过while循环来实时监听服务器端发送的消息)
注意:数据是以字节流(Byte[])的形式传递的,我会使用Encoding.UTF8.GetString()方法来获取为字符串。都是通过Send()来向彼此发送消息。