需求是这样的
比如我现在的服务端可以承受30个用户,那么如果直接用serversocket可以在服务端维护一个当前连接用户的一个列表,但是在客户端两两匹配后,就会有更复杂的逻辑处理,这时候我就想把这两两配对的用户作为一个线程来处理,问题就出来了
我可以把多线程都做好,但是这样的话我服务端第一个serversocket维护的用户列表里面的用户句柄怎么给线程让他发送相应的数据给用户其实需求就好比如一个棋牌类游戏的服务端比如所有用户都在房间内,然后每个桌子坐两个人,两个人都举手了后开始游戏后就要处理更复杂的游戏的逻辑以及网络传输、倒计时等我的问题是如果两个用户都举手后我怎么把我的主ServerSocket上需要发送的消息给到线程中比如我的主ServerSocket放在Form1上面,用它来等待用户的请求,如果两个用户匹配成功后就开启一个线程,在线程里面处理逻辑没啥问题,但是我就是不知道放入线程后怎么给线程内两个用户发送消息了
就像大家都举手了后给一个10秒倒计时准备,然后再开始游戏的这个功能一样或者我说的不够清楚,不知道大家能不能理解我的意思如果有人能理解请指点一下目前我可以自己实现线程类或者在serversocket的GetThread里面去创建线程,不知道怎么把ServerSocket里面维护的列表和线程里面的列表匹配起来并且给他们发送相应的信息在线等

解决方案 »

  1.   

    如果各位能给一个简单的Demo最好
      

  2.   

    基本明白你意思了, 
    说下我的思路
    服务端只管收不同命令的包,收到包后,放到线程去处理,不影响服务端收包
    至于哪个和哪个联系, 应该是在包里附带的信息里, 比如包的设计中带有 同桌的IP和端口号, 
    这样我就知道该和哪几个IP和端口号去通讯
      

  3.   

    如果按照你的逻辑我说一个流程咨询你一下假如你和我坐同一个桌子并且都开始游戏那么这个时候我就要把你我相关的数据丢到这个线程里面去处理,我想问的是做到这一步我没有问题,但是我想问的是,当把这个业务逻辑线程启动后,这个逻辑线程里面开始倒计时,我怎么把这个倒计时信息通过主ServerSocket发回给客户端,当然我可以把你我的sockethandle获得,但是如果要同步主界面的ServerSocket的话我想那样应该效率很低,如果只有一桌就很好处理但是如果有假定一百桌同时都在倒计时,而且每桌的倒计时时间也都不一样,比如你我倒计时到8的时候其他桌才刚开始也就是需要两两发送一样的信息,这样效率是不是太低了
    返回来说,第一个问题是我还不知道怎么从线程里面调用主ServerSocket来发送消息可以给一个完整的Demo吗?就是说能从线程调用主ServerSocket来发送消息这个功能
      

  4.   

    如果我在每个线程里面创建一个ServerSocket的话这样效率我想肯定会很高
    但是另外一个问题是,如果这样做那么客户端就需要创建线程后重新连接一次服务器,那么又需要重新启动一个线程,那么这个逻辑是不通的,因为一个主机绑定的端口不能被重新绑定,如果换端口进行绑定那么客户端势必需要重连,但是线程又是靠主ServerSocket的里面的某个逻辑来创建的所以看起来像死循环
    请各位高手指点一下思路最好是能给一个简单的Demo不胜感激
      

  5.   

    SOCKET 效率高 一般都是非堵塞方式,另外SOCKET I/0 中利用WINDOWS内核的,比如重叠 ,完成端口
    你只有几十个客户端,没必要那么高效
    ServerSocket 我没用过, 我都自己写原始SOCKET, 主要是兼容我C++代码,  只要稍微转下就是C++代码
    每个线程创建SOCKET,肯定效率会高些的,  
      

  6.   

    很简单在一个线程启动后我们做一个while
    做一个boolean就可以了
    然后sleep(1000);inc一次
    假定要10秒那么做个判断后修改boolean的值就是了
    这里不讨论如何实现这个倒计时
    只是说在创建线程后如何从线程中根据socket.sockethandle来从主serversocket发送给相应的用户消息
      

  7.   

    倒计时 说下我的理解
    服务端保存 在线用户用户的基本信息, 包括 IP, 端口,状态(举手, 游戏开始), 桌号
    A 在举手状态, 同时心跳包和服务端通讯 
    如果同桌的B 也是举手了状态, 查询同桌的基本信息,如果发现同桌的A也是举手状态,则给这俩用户发送消息,通知游戏开始?
      

  8.   


    我是把你的顺序反过来说了我是说我们都开始了其实这个倒计时是无意义的,我只是用它来举例,就是创建线程后怎么通过线程给这两个人发消息因为线程执行完了自己会销毁,就会退出线程,为了模拟可以用倒计时来代替而已重点还是线程和主ServerSocket的维护列表之间的问题
      

  9.   

    我也在使用delphi自带的serversocket做服务器开发,连接在140个左右。并发连接在50个左右。运行一段时间后,客户端已经重连了,但是服务器并未自动关闭旧的连接,不知是什么原因。请大师指教。
      

  10.   

    先学delphi 自带的学习学习.
      

  11.   

    delphi自带的有没有多线程的socket的例子?
      

  12.   

    定义个类, 包括用户名,IP,连接等你需要的信息
    定义类的LIST  每当有会话信息来临时,循环LIST判断,就可以了