首页 > 其他分享 >【unity】socket聊天室

【unity】socket聊天室

时间:2022-11-26 16:13:43浏览次数:65  
标签:聊天室 socket unity 服务端 关闭 连接 Socket 客户端

前言

之前接触过多人联机游戏的开发,但使用的是现成的框架。今天来使用.NET原生的socket来做一个聊天室。

关于Socket

Socket是什么

Socket是为了方便使用TCP/IP协议栈而抽象出来的一组接口。

Socket解决了什么问题

我们在建立通信时,只需理解Socket接口,而复杂的TCP/IP协议族则隐藏在Socket接口后面,我们无需理会。服务端和客户端双方利用一对Socket就可以建立连接通信,这大大方便了网络通信。

连接步骤

使用Socket建立连接步骤如下:

  1. 服务端监听某个端口;

  2. 客户端向服务端地址和端口发起Socket请求;

  3. 服务端接收连接请求后创建Socket连接,并维护这个连接队列;

  4. 客户端和服务端已建立起了双向同信,客户端与服务端就可以彼此发送消息。

烟雨大佬的博客中有他的实现,自己亲手跑一跑就能理解其流程了,指路->
Socket学习笔记-烟雨迷离半世殇

下面是我的结果:

image

image

聊天室

仓库指路->Unity-ChatRoom

广播消息

仅仅是客户端和服务端建立连接还不够,因为每个客户端发的消息都要显示在聊天框中,这意味着服务端收到消息后,还要再做一遍转发,转发给在聊天室内的所有客户端。

在烟雨大佬的实现的基础上,我在服务端中定义了一个List<Socket>
每当有客户端连接成功,就添加进其中;
每当有客户端退出连接,就从中移除;
每当接收到消息,就遍历它逐个做消息转发。

连接关闭

这里我遇到了一些问题。

哪一方主动关闭连接

这个看情况,大部分时候是客户端主动关闭,比如客户端要退出了;但有时候也由服务端主动关闭,比如某个客户端很久都没有动作,俗称挂机,为了避免资源的不必要占用,可以由服务端主动关闭连接。

如何关闭连接

客户端主动发起关闭如下:

clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();

对于面向连接的协议,建议在调用 Close() 方法前先调用 Shutdown() 方法。这能够确保在已连接的Socket关闭前,其上的所有数据都发送和接收完成。

Close()会关闭远程主机连接,并释放所有与此Socket相关的托管资源和未托管资源。关闭后,该Socket对象的Connected属性会设置为false

还有两个关闭连接的API,如下:

//关闭Socket连接,并根据提供给方法的参数决定是否允许重用实例。
clientSocket.Disconnect();

//释放当前Socket实例所使用的未托管资源,并且提供可选操作来释放当前Socket实例所使用的托管资源。
clientSocket.Dispose();

常见错误

  1. 无法访问已释放的对象;
    image
    socket.close()后,这个socket又一次被调用时,就会出现该错误。
    建议在关闭连接之后使用Socket对象的Connected属性来做一些判断,跳出原调用路径。

  2. 远程主机强迫关闭了一个现有的连接。
    image
    有一方不按规范主动中断连接就会这样。
    有博客说可以通过异常处理的方式,通过异常来提示网络不正常,然后跳出该程序分支。这个方法听上去挺万能的,比方说多人联机网络波动导致退出,应该就可以这样解决。

参考资料

Socket学习笔记-烟雨迷离半世殇

C#中Socket的简单使用

C#中Socket关闭 Close、Dispose、Shutdown、Disconnect

标签:聊天室,socket,unity,服务端,关闭,连接,Socket,客户端
From: https://www.cnblogs.com/OtusScops/p/16885905.html

相关文章

  • websocket 测试
    npminstall-gwscatwscat-l8888wscat-cws://127.0.0.1:8888  constWebSocket=require('ws');constws=newWebSocket.Server({port:8777});ws.on('connection......
  • nginx socket() failed (24: Too many open files)
    访问量的增大,相应nginx连接数,以及打开的文件数,是需要调整的,不然就会报以下错误2019/10/1016:04:37[alert]364127#0:*11935302socket()failed(24:Toomanyopenfi......
  • Flyway Teams Edition or MySQL upgrade required: MySQL 5.6 is no longer supported
    运行项目的时候出现org.springframework.beans.factory.BeanCreationException:Errorcreatingbeanwithname'flywayInitializer'definedinclasspathresource[o......
  • 基于协程的,socket并发,server端永不断开
    基于协程的,socket并发,server端永不断开classTCPserver():defserver(self,server_ip,port):s=socket(AF_INET,SOCK_STREAM)s.setsockopt(SO......
  • Socket 如何处理粘包
    Socket如何处理粘包什么是粘包什么是半包?粘包:比如发送了AABB两条消息,但是另一方接收到的消息却是AAB,像这种一次性读取了俩条数据的情况就是粘包半包:比如发送的消息......
  • JFinal整合spring的websocket
    在使用JFinal整合spring使用spring的websocket的时候,遇到了很多问题,下面介绍整合的全过程和要注意的点。(整个项目使用maven进行搭建,服务器用的是eclipse自带的jetty)1.整个po......
  • spring配置websocket并实现群发/单独发送消息
    spring框架中自带了websocket的jar包,利用它可以实现与H5中WebSocket的对接,甚至websocket还可以通过依赖注入与http请求一同工作,详细配置实现过程如下文件目录结构如下,主要是......
  • nestjs搭建HTTP与WebSocket服务
    最近在做一款轻量级IM产品,后端技术栈框架使用了nodejs+nestjs作为服务端。同时,还需要满足一个服务同时支持HTTP服务调用以及WebSocket服务调用,此文主要记录本次搭建过程,......
  • unity 实现鼠标悬停显示物品信息
    主要用到委托和事件C#委托官网API:event:Link委托:Link鼠标事件方法,需要继承这两个接口IPointerEnterHandler,IPointerExitHandler从而生成以下两个方法OnPointerEnter(......
  • 【Cocos2dx通信(Http&Socket)相关编译到Android细节总结】编译加入curl关联lib与头文
    本站文章均为​​ 李华明Himi ​​​原创,转载务必在明显处注明:​​​​​本篇介绍在Cocos2dx中加入网络通信相关代码,然后编译到Android时出现的一些细节和需要注意的地方......