小弟这几天备受煎熬!我将异步Socket封装成3中类型:客户端须连接的Socket,服务器监听的Listener和服务器端发送接收数据的Server都写成了Dll。这几天在测试的时候老是出现一个IDE的Exception让我很郁闷。盖了又改,还是出现:(说是什么InvalidOperation。正在我要放弃的时候,突然发现并非这些Socket引起的Exception。而是企图读取Server类中一个LocalEndPoint。天哪!这个能解释么?当然现在我已经注释掉了此语句。可是难道不能访问么?

解决方案 »

  1.   

    问题可以这样解决:服务器端:1.首先服务器端建立一个服务器socket对象并设定一个端口用于一直侦听socket(端口肯定是可以自己设定的)。2.当侦听到一个socket连接建立后,建立一个新的线程用于一直等待接收该socket发送的信息3.服务器对象的方法中,应包括:      BuildSocketList:建立所有正在连接中的客户端socket的列表,当客户端失去连接(disconnected)时,从表中去除该socket      SendMessageCenter:此方法的作用是,一但服务器接收到某个客户端发送的信息,则信息由该方法处理,并由该方法负责判断此条信息应该传给socketList中的哪一些socket(用于公聊/私聊/直接反馈信息给发送者)
    客户端:在客户端所要做的事情相对简单一些,主要是三点:1.建立连接到服务器端的socket。2.主线程用于等待用户输入信息,一旦用户输入信息,该信息传送给服务器端。3.建立一个后台线程,用于不停等待服务器端发送过来的信息,一旦服务端发送信息,则将信息反馈给客户端。另外,Server和Client两端传送的信息,最好是制定一个简单的协议,用于控制信息的分类,例如聊天命令等等。
    鉴于是聊天系统,可以直接发送string流,不用考虑byte[] buffer问题。
    核心问题就是这些,.net还没研究,我是用java实现的,研究了一两天呢!呵呵!
    有什么问题,继续交流,呵呵。
      

  2.   

    另外,我觉得你在服务器端的设计似乎有点问题。服务器端应该只需要建立一个ServerSocket就可以了,因为一个socket可以和多个socket建立通道,并不影响。我觉得应该从线程以及协议方面考虑,而不用过多的考虑socket的问题。主要问题是线程间的数据共享/传输协议。
      

  3.   

    嘿,你好。很高兴看到你的建议:)
    确实我把信息分类了,专门设计了一个class负责消息的合成和解释。
    难道一个ServerSocket可以和多个客户连接?这个让我很难理解。以前用vb做这样的milestone时就是load sock[i]这种形式;现在.NET中我并没有觉得有大的改变,我的Listener接收到连接请求时就给出一个Socket,这时就实例化一个ServerSocket,Listener给出的Socket就作为构造函数的参数。能多给点解释么,谢谢。
    现在我的问题是一个用户掉线之后,我要析构这个ServerSocket,然而没有什么东西可以让我析构,应为DotNet里的Socket没有析构,难道要用GC?如果是该怎么用呐?
    期待着你的恢复:)
      

  4.   

    详细的结构设计昨天我已经写好了,你可以到“技术”栏目察看我的文章,有什么具体的问题可以直接在下面的评论中提出:)http://www.csdn.net/Develop/Article/17/17912.shtm
      

  5.   

    marila,你好
    看过你的文章,之前我在设计的时候都已经设计好了。现在是一些技术上比较细节的问题,应为我是负责socket和消息解释的。这两块我现在基本上都做好了。都已经测试过了。现在的问题是:监听停止之后再次监听,在绑定端口时抛出了异常