ServerSocket和ClientSocket的问题,希望高手指点。(200分)

  • 主题发起人 主题发起人 manmanchong
  • 开始时间 开始时间
M

manmanchong

Unregistered / Unconfirmed
GUEST, unregistred user!
我一个通讯程序,有客户端程序和服务端程序,当一个服务端对应一个客户端时没有问题,
而一个服务端对应多个客户端时出问题,经常是地址访问错误。
每个客户端每5分钟到服务端取数据,如果当前只有一个客户端的时候没有问题,就是2个
或以上客户端访问时容易出问题,请问该怎么解决?服务端的ServerType为stNonBlocking,
 
以前都有这方面的问题,非常简单,你自己查找一下,快点给分吧。我这里不重复。
 
goodhq:
我找过了,就是没有找到啊!

我想如果当前有一个客户端连接了,那后来的就不能再连接进来。
但是如果当前没有连接,而此时又2个客户端同时来连接,
那该怎么办呢?能否只建立和一个客户端的连接,而另一个不连接呢?
 
我最近刚做完,一个通讯方面的项目,同时100个客户段都没有问题,
你是否在程序中用了多线程?客户短是否也用非阻塞模式?
 
找DEMOS中的例子,仔细看看,几百个用户都没有问题,何况2个用户,看样子你没有真正理解TServerSocket
 
看那个CHAT的DEMO
 
主键更新
 
<<我想如果当前有一个客户端连接了,那后来的就不能再连接进来。>>
这是不可能的,理论上ServerSocket可以连接不受限制的客户端,
如果用Blocking模式,每有一个客户端请求建立连接时,ServerSoket
会为该客户端建立一个套接字,并启动一个线程监听该套接字,
如果用noneBlocking模式,则ServerSocket,也会为每个客户端建立套接字,
但只有一个主线程在监听!
 
我的s和c端程序都是单线程的,c端是ctNonBlocking,s端是stNonBlocking。
我现在假如有10客户端同时访问,那我的s端一次只处理一个客户端的连接,其他的都等。
那该如何 处理啊!CHAT那个DEMO太简单了,什么都没有说啊!
雨人:能否介绍介绍你的程序啊?谢谢。
 
雨人:<<我想如果当前有一个客户端连接了,那后来的就不能再连接进来。>>
我现在是这样处理的,在OnClientConnect事件中判断当前连接数是否大于1,如果大于,
则s发送一个“busy”的信息给c,对应客户端收到“busy”后就自动关闭了。但是如果有
2个以上c同时来连接,也就是第1个c来的时候,发现当前连接数=1,同时,第二个c来的时候
发现当前连接数也是=1,这样就没有控制好,会有2个c和s通讯了,我想怎么控制当前只有
1个c和s通讯?
 
<<我想如果当前有一个客户端连接了,那后来的就不能再连接进来。>>
这个比较简单

在ServerSocket的OnAccept事件中写上
ServerSocket.Socket.Lock;
就可以了
 
我的项目中是这样处理的,Socket在接受和发送数据时占用的时间是最少的,
而大部分时间是在处理数据(操作数据库),我的程序中,主线程负责监听
Socket,当监听到数据数据时会教给一个线程处理。
 
当然如果客户端特别多的时候,数据量特别大的时候,
建议用线程池,和数据池。
我的思路如下:
程序启动时,建立n个线程负责数据处理(或者叫做业务逻辑处理),如果涉及到数据
库,那没个线程对应一个数据库连接,把建立的n个线程放入线程池,如果有客户端请求
时,从线程池中取出一个线程处理数据,如果线程池里没有线程则把请求数据(请求标识,
套接字handle)放入数据池,当线程结束时先检查数据池中是否有数据,如果有则把数据
交给线程,运行线程,如果没有,则把线程放入线程池。
 
雨人:我的程序要实现的功能和你的很类似,我的程序:建立连接-》数据库中取出适量
数据-》每次发送一部分(收到c的返回success信息后,发送下一部分)。
可惜我现在只能处理一个c端。你的serversocket的servertype和clientsocket的clienttype
是怎么设置的?
 
都是非阻塞模式,ctNonBlocking。

 
雨人,我的客户端不会很多,目前5、6个,每个客户端每2分钟连接一次,一次占用10来秒。
 
这样没有任何问题呀,我的客户段是一直连接的,而且都在不停的处理数据,没有任何
影响的
 
我的QQ:455060
 
雨人:如果都是ctNonBlocking,那么2个或多个c来的时候,s端的OnClientConnect事件是
有可能并发呢还是要一个一个的执行呢?
 
不可能并发,因为只有一个主线程,怎么去并发呀
 
后退
顶部