我做了一个局域网通讯的程序,其中用的控件是TServerSocket,TClientSocket。侦听5000端口,已经测试成功。但是忽然想起来,如果在某一台机子上,运行了两个client,行不行呢?试了一下,竟然出现提示“一般一个套接字只用一次”之类的。现在再改,麻烦大了。请问有办法么?

解决方案 »

  1.   

    让Client程序只运行一次行不行?
      

  2.   

    那就不允许同时运行两个client不就行了???
      

  3.   

    防止程序运行两次,加到工程的代码中去//project-->view source var hMutex: THandle;
    begin
      hMutex := OpenMutex(MUTEX_ALL_ACCESS, True, 'YourString');
      if hMutex <> 0 then Exit;
      hMutex := CreateMutex(nil, False, 'BambooChatHotKey');
      if hMutex = 0 then Exit;
      try
        Application.Initialize;
        Application.CreateForm(TForm1, Form1);
        Application.Run;
      finally
        ReleaseMutex(hMutex);
      end;
    end.
      

  4.   

    呵呵,为什么非要只运行一个client呢,你想啊,并不是每个单位都有条件一个人一台机子的。比如有的科室只有一台机子。。
      

  5.   

    用TServerSocket侦听,它会根据client的数量自动分配一个什么对象的,具体查查书吧
      

  6.   

    zfming() :我说的是一台机子上运行两个client的问题,并不单纯是一个server多个client的问题。
    这个问题这么难吗?没有人能够解决么?
      

  7.   

    QQ用的是UDP当然可以了,请参看有关选项中REUSEADDR,REUSEPORT
    有的介绍说TCP是绝对不可以的。这种因为你每一台机器都既是服务器,又是客户机,所以不太可能,假如专门用一台机器做服务器的话,就没问题了。
      

  8.   

    在Server端为每一个Client开一个线程
      

  9.   

    奥,那这么说,如果用一台机子做服务器的话,用TCP,那么一台机子上就可以开多个终端喽?还是TCP根本就不行?
      

  10.   

    将Tclientsocketd的Clienttype属性设成异步连接试试。
      

  11.   

    为什么老是有人“使用一次就行了”呢?急得我上火,如果能用一次,我才不用两次呢?正是因为并不是人手一机,所以可能一台机子上要打开多个client呀
      

  12.   

    如果说用tcp,用一台机子做服务器,其他机子都是终端,那么,终端之间可不可收发消息呢?
      

  13.   

    如果要实现在一台机上用多个Client的话可以这样实现:
    当一个Client产生时就分配一个端口,然后检测这个端口是否已经在使用了,如果是的话就重新分配一个(比如端口号+1).
    Client与Client之间通讯可以通过Server转发.
      

  14.   

    但是怎么让Sercer端知道客户端在用一个新的端口了呢?
    我觉得像你这样的情况可以这样:
    多个Client其实只是多个字符窗口而矣,真正进行通讯的只有一个client端程序,也就是说,所有的Client都只是把要发的字符(加上一个标志)发给这个Client通讯程序,然后再由这个程序发给Server.再在server端将它重新分配.
    你可以把以前写的东西大致保留,变成一个DLL文件就行了.
      

  15.   

    要进行WinSockc通讯,一定要存在两个部分,一个就是倾听方,也就是服务器端,通常用的TServerSocket Component来代替,它主要倾听客户端的请求,另一个是请求方,也就是客户端(TClientSocket它是向服务器发送请求,当来自客户端的请求被服务器接受,也就是说,通讯建立了。
    你的问题应该用线程来做才可能实现多个Client之间进行通信,就是通过TServerSocket的OnTreadStart的事件上创建线程,否则,Client之间不能进行通信.
    TServerSocket一定是stThreadBlocking
    而TClientSocket一定是ctNonBlocking
    我发觉你位对这ClientType并不清楚,下面我解释:
    在TClientSocket通常有两种ClientType,一种是阻塞方式(ctBlocking),而另一种是非阻塞方式(ctNonBlocking),阻塞方式方式通常用于同步通讯方式,也就是发出请求后需要立即响应服务器的回复,这种方式通常用于聊天,等等同步方式,而非阻塞方式是用于异步通讯方式,就是说发出请求后不需要立即响应服务器的回复,这种方式通常用于邮件传输。