今天我们用TCP协议做一个多人实时聊天。
首先我们需要创建两个工程,一个为客户端,一个为服务端。两者是什么区别呢?
服务端开启服务就可以了,客户端要找到服务端并连接它。
客户端就代表一个人,它可以发送自己要说的话。
服务端是起到广播,中转的作用。收到其中某个客户端发送的消息,将他转发给所有的客户端,就达到多人聊天的效果了。
我们从客户端开始入手
一.客户端
首先网络通信要确定IP跟Port(端口号)
提前创建二进制数组,方便收到消息的时候接受
1.定义变量
2.建立连接方法
socket三个参数代表:网络,采用数据流形式,使用TCP协议
Begin开头的函数,代表异步函数。传入对应的IP,Port
使用try catch结构,如果连接失败,会输出失败的信息
ConnectCallback是当成功连接到服务端的时候,会执行这个回调函数
socket.EndConnect(ar);
不是结束连接,而是确认连接操作的结果并准备好使用该套接字进行后续的通信。
socket.BeginReceive(readBuff, 0, 1024, 0, ReceiveCallback, socket);是当收到消息时,会将受到的字节数存储到readBuff中,从0位开始存入,最多支持1024字节,接收的标志通常为0,ReceiveCallback为收到回调
EndRecive会结束异步接收操作,因此我们在下面再次开启接收,这样就可以一直收到消息。(如果这里不在进行socket.BeginReceive(readBuff, 0, 1024, 0, ReceiveCallback, socket)函数,那么在收到第一次的消息后,后面就不会再监听消息了)
3.发送消息
将文本内容转为二进制发送给服务端
4.关闭客户端
二.服务端
服务端端跟客户端的接收、发送都是类似的
我们可以根据上面的那个流程图执行对应的步骤,先开始绑定IP,Port
1.应答回调
这里的可以获取到对应的客户端socket,然后将客户端socket存储起来,再发送的时候,遍历每一个客户端socket就达到了广播的作用
这里再拿到监听的结果后,跟客户端一样,再次开启监听,就能连接上多个客户端。(注销掉 serverSocket.BeginAccept(AcceptCallback, serverSocket)就只能一个客户端连接上服务端,后续服务端就不在监听了)
2.广播消息
这里大家可以试试,如果在客户端发送close方法,服务端就会移除对应的客户端