哎呀,这可怎么办哪? 我做了一个局域网通讯的程序,其中用的控件是TServerSocket,TClientSocket。侦听5000端口,已经测试成功。但是忽然想起来,如果在某一台机子上,运行了两个client,行不行呢?试了一下,竟然出现提示“一般一个套接字只用一次”之类的。现在再改,麻烦大了。请问有办法么? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 让Client程序只运行一次行不行? 那就不允许同时运行两个client不就行了??? 防止程序运行两次,加到工程的代码中去//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. 呵呵,为什么非要只运行一个client呢,你想啊,并不是每个单位都有条件一个人一台机子的。比如有的科室只有一台机子。。 用TServerSocket侦听,它会根据client的数量自动分配一个什么对象的,具体查查书吧 zfming() :我说的是一台机子上运行两个client的问题,并不单纯是一个server多个client的问题。这个问题这么难吗?没有人能够解决么? QQ用的是UDP当然可以了,请参看有关选项中REUSEADDR,REUSEPORT有的介绍说TCP是绝对不可以的。这种因为你每一台机器都既是服务器,又是客户机,所以不太可能,假如专门用一台机器做服务器的话,就没问题了。 在Server端为每一个Client开一个线程 奥,那这么说,如果用一台机子做服务器的话,用TCP,那么一台机子上就可以开多个终端喽?还是TCP根本就不行? 将Tclientsocketd的Clienttype属性设成异步连接试试。 为什么老是有人“使用一次就行了”呢?急得我上火,如果能用一次,我才不用两次呢?正是因为并不是人手一机,所以可能一台机子上要打开多个client呀 如果说用tcp,用一台机子做服务器,其他机子都是终端,那么,终端之间可不可收发消息呢? 如果要实现在一台机上用多个Client的话可以这样实现:当一个Client产生时就分配一个端口,然后检测这个端口是否已经在使用了,如果是的话就重新分配一个(比如端口号+1).Client与Client之间通讯可以通过Server转发. 但是怎么让Sercer端知道客户端在用一个新的端口了呢?我觉得像你这样的情况可以这样:多个Client其实只是多个字符窗口而矣,真正进行通讯的只有一个client端程序,也就是说,所有的Client都只是把要发的字符(加上一个标志)发给这个Client通讯程序,然后再由这个程序发给Server.再在server端将它重新分配.你可以把以前写的东西大致保留,变成一个DLL文件就行了. 要进行WinSockc通讯,一定要存在两个部分,一个就是倾听方,也就是服务器端,通常用的TServerSocket Component来代替,它主要倾听客户端的请求,另一个是请求方,也就是客户端(TClientSocket它是向服务器发送请求,当来自客户端的请求被服务器接受,也就是说,通讯建立了。你的问题应该用线程来做才可能实现多个Client之间进行通信,就是通过TServerSocket的OnTreadStart的事件上创建线程,否则,Client之间不能进行通信.TServerSocket一定是stThreadBlocking而TClientSocket一定是ctNonBlocking我发觉你位对这ClientType并不清楚,下面我解释:在TClientSocket通常有两种ClientType,一种是阻塞方式(ctBlocking),而另一种是非阻塞方式(ctNonBlocking),阻塞方式方式通常用于同步通讯方式,也就是发出请求后需要立即响应服务器的回复,这种方式通常用于聊天,等等同步方式,而非阻塞方式是用于异步通讯方式,就是说发出请求后不需要立即响应服务器的回复,这种方式通常用于邮件传输。 自定义联纸224×275 横向打印 总是出错, 关于数据录入窗体的问题~~~ [SOS]在DELPHI中如何引用一个开发包,如ADO之类的 如何使用IBDatabase连接远程InterBase数据库 分布式的问题,求助! 请问各位大侠,如何调用在RemoteDataModule中声明的过程? 这样创建的窗体怎么查找它的句柄? 问题要求很简单,想回答出来却挺难。。 关于OPENGL视点的问题 有谁做过档案管理系统?希望大家讨论关于档案借阅的有关处理。(来的都是客,全在分数上,参与讨论者有分) 找到一个好东西,喜欢用mysql的这下可有福了! 高手请进!!!
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.
这个问题这么难吗?没有人能够解决么?
有的介绍说TCP是绝对不可以的。这种因为你每一台机器都既是服务器,又是客户机,所以不太可能,假如专门用一台机器做服务器的话,就没问题了。
当一个Client产生时就分配一个端口,然后检测这个端口是否已经在使用了,如果是的话就重新分配一个(比如端口号+1).
Client与Client之间通讯可以通过Server转发.
我觉得像你这样的情况可以这样:
多个Client其实只是多个字符窗口而矣,真正进行通讯的只有一个client端程序,也就是说,所有的Client都只是把要发的字符(加上一个标志)发给这个Client通讯程序,然后再由这个程序发给Server.再在server端将它重新分配.
你可以把以前写的东西大致保留,变成一个DLL文件就行了.
你的问题应该用线程来做才可能实现多个Client之间进行通信,就是通过TServerSocket的OnTreadStart的事件上创建线程,否则,Client之间不能进行通信.
TServerSocket一定是stThreadBlocking
而TClientSocket一定是ctNonBlocking
我发觉你位对这ClientType并不清楚,下面我解释:
在TClientSocket通常有两种ClientType,一种是阻塞方式(ctBlocking),而另一种是非阻塞方式(ctNonBlocking),阻塞方式方式通常用于同步通讯方式,也就是发出请求后需要立即响应服务器的回复,这种方式通常用于聊天,等等同步方式,而非阻塞方式是用于异步通讯方式,就是说发出请求后不需要立即响应服务器的回复,这种方式通常用于邮件传输。