关于Socket的一些疑惑。

NewPersonality 2007-02-10 04:30:56
用 ServerSocket 和 ClientSocket 建立一个 客户-服务器-客户 之间的通讯,
当一个客户成功的登录时,seversocket 产生一个唯一的 socket 与这个客户
对应。
那么 如果我发送一个需要从服务器上下载大文件的消息,并且开始通过socket传送这个文件了,而此时如果有其他用户给我发送消息,那么socket如何处理来避免冲突?
...全文
198 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
sbkopoky 2007-02-17
  • 打赏
  • 举报
回复
有一个香港和悦网络电话的源文件 ,有兴趣妨进入我的BLOG看看
old_bonze 2007-02-12
  • 打赏
  • 举报
回复
这就涉及到你如何实现你的服务器的问题了。
每一个客户端建立与服务器的连接,服务器端就建立一个套接字(TCustomWinSocket)与客户端对应,服务器与客户端的通讯就依赖于它。如果有两个客户端连接,就建立两个……如此类推。
你的疑问是当你正在处理某个与客户端的通讯、而且耗时较长时,其它客户端如何顾及,从最根本的解决方法来说,就是用“线程”。客户端每建立一个连接,除了生成一个套接字与之对应外,还创建一个线程,该线程负责本客户端的所有通讯处理任务。
在CB中,将TServerSocket的ServerType属性设为stThreadBlocking(线程阻塞模式),当客户端建立到服务器的连接后,会触发OnGetThread(TObject *Sender,TServerClientWinSocket *ClientSocket,TServerClientThread *&SocketThread)事件,在事件里,创建一个自己写好的、继承自TServerClientThread类的处理线程对象,并将它赋值给SocketThread就行,此后,你的线程专门负责通讯处理就行了。
如果你觉得自己写线程很麻烦的话(其实线程并不复杂),CB还允许将TServerSocket的ServerType属性设为stNonBlocking(非阻塞模式),在这种模式下,你不需要自己写处理线程代码,ServerSocket当发现某个套接字有读/写数据时,会自己触发OnClientRead/OnClientWrite事件,事件的参数中有一个TCustomWinSocket *Socket,这就代表了当前读/写操作对应是哪个套接字。切记,OnClientRead/OnClientWrite不可太费时,否则其它读/写请求等到花儿也蔫巴了。
pp616 2007-02-11
  • 打赏
  • 举报
回复
传文件另外建一个连接。类似ftp 或是数据包里+标志。分析每个包是文件数据还是消息。
NewPersonality 2007-02-10
  • 打赏
  • 举报
回复
up

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧