winsocket多个客户端连接的问题

chuting1 2011-08-04 11:09:16
服务器端开放一个端口1399,启动时默认为侦听状态

If sockServer.State <> sckClosed Then
sockServer.Close
End If


sockServer.LocalPort = "1399"
sockServer.Listen

服务器连接请求处理:
Dim msgResult As VbMsgBoxResult
If sockServer.State = sckListening Then
sockServer.Close
End If

lstStateInfo.AddItem "服务器收到连接请求"
sockServer.Accept requestID
lstStateInfo.AddItem "连接成功"


客户端连接

sockClient.Protocol = sckTCPProtocol

If txtServerName.Text <> Empty Then
sockClient.RemoteHost = txtServerName.Text
Else
lstStateInfo.AddItem "必须输入服务器名称或IP地址"
Exit Sub
End If

If txtServerPort.Text <> Empty Then
sockClient.RemotePort = txtServerPort.Text
Else
lstStateInfo.AddItem "必须输入远程端口"
Exit Sub
End If

sockClient.Connect



客户端数据发送

sockClient.SendData txtSend.Text



一个客户端没有关系,第二个客户端打开连接时,就会返回“连接被强制拒绝”
如果不使用connect,直接数据发送,则会提示"所需事物或请求的错误协议或连接状态"

是什么原因,请指点
...全文
167 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
chinaboyzyq 2011-08-04
  • 打赏
  • 举报
回复
[Quote=引用 MSDN]
接受多个连接请求
上面设计的基本服务器只能接受一个连接请求。通过创建控件数组,使用一个控件也可以同时接受多个连接请求。利用这种方法,不需要关闭连接,而只需创建新的控件实例(通过设置其索引属性),然后在新的实例上调用 Accept 方法。

下面的代码假定名为 sckServer 的窗体上有一个 Winsock 控件,它的 Index 属性被设置为 0;因此控件是控件数组的一部分。在声明部分,声明了一个模块级的变量 intMax。在窗体的 Load 事件中,intMax 被设置为 0,数组中第一个控件的 LocalPort 属性被设置为 1001。然后调用控件的 Listen 方法,使之成为“监听”控件。在连接请求到达时,代码将检测 Index 是否为 0(“监听”控件的值)。如果为 0,监听控件将增加 intMax 的值,并使用该号码来创建新的控件实例。然后,使用新的控件实例接受连接请求。

Private intMax As Long

Private Sub Form_Load()
intMax = 0
sckServer(0).LocalPort = 1001
sckServer(0).Listen
End Sub

Private Sub sckServer_ConnectionRequest _
(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
intMax = intMax + 1
Load sckServer(intMax)
sckServer(intMax).LocalPort = 0
sckServer(intMax).Accept requestID
Load txtData(intMax)
End If
End Sub


[/Quote]
sqtadk 2011-08-04
  • 打赏
  • 举报
回复
问题出在这里:
If sockServer.State = sckListening Then
sockServer.Close
End If

你把这段去掉就没问题了
wildone 2011-08-04
  • 打赏
  • 举报
回复
是winsock只能进行一组连接吧?
chuting1 2011-08-04
  • 打赏
  • 举报
回复
是不是一个服务器器一个端口只能和一个客户端连接?

在服务器连接请求里加了
If sockServer.State = sckAlreadyConnected Then
sockServer.Accept requestID
lstStateInfo.AddItem "连接成功"
End If
还是不行
chuting1 2011-08-04
  • 打赏
  • 举报
回复
谢谢,楼上正解
一、物理架构说明 游戏系统组件包括: 服务器系统(中心服务器控制系统,服务器登陆控制系统,游戏登陆服务器,游戏房间控制系统,游戏组件系统),游戏客户端(游戏大厅,游戏组件)。 数据库系统:用于保存用户信息数据、游戏积分数据、游戏系统运行状态数据,系统日志数据等数据。 中心服务器控制系统:用于向客户端提供全局配置,初始化数据使用。 服务器登陆控制系统:用于房间服务控制系统登陆效验使用。 游戏房间控制系统:用于控制游戏房间的启动,停止,添加,删除,管理等。 游戏组件系统:用于具体游戏服务,被游戏房间控制系统挂接,提供游戏服务。 游戏大厅:游戏玩家连接游戏使用。 二、系统结构 系统选用的开发工具是优秀的Microsoft Visual C++.net2003,系统采用客户端/服务器(C/S)编程模式,TCP/IP协议作为客户端和服务器的通信网络层,运用具有性能最优的完成端口(IOCP:Input/Output Completion Port )网络开发模型搭建服务器软件.客户端采用WinSocket API作为网络层。 系统采用多服务器分布式架构,由一个中心服务器(CENTERSERVER),多个主服务器(MainServer)和多个从服务器(LocalServer)同时工作以实现游戏逻辑和用户管理及通讯的功能。中心服务器向客户端提供全局配置,初始化数据(主要是定位一个主服务器IP地址),主服务器管理客户端用户身份验证、登录以及管理从服务器的建立,由多个从服务器管理游戏通信,大厅及房间,从服务器可任意添加、删除、修改等。 网络棋牌游戏服务器架构全文共7页,当前为第1页。系统首先启动中心服务器(CENTERSERVER), 中心服务器从INI文件中读取MainServer列表信息, 客户端提供全局配置,初始化数据,然后等待客户联结, 客户联结后CENTERSERVER定位一个MainServer的IP地址和端口号,发往客户端, 客户端收到后断开CENTERSERVER的联接,并马上用MainServer的IP地址和端口号,和主服务器(MainServer)连接.主服务器从数据库中读取从服务器的所有信息到主服务器的内存。首先读取ComType表以建立所有的游戏类型的基本信息,然后读取ServiceInfo(界面树结点信息表)以获得包括客户端界面结构、从服务器的信息、大厅和房间的一切信息。当有客户端请求登录并成功和主服务器连接的时候,主服务器将这所有的信息一次性发到客户端内存,客户端根据这些信息生成界面结构树。 网络棋牌游戏服务器架构全文共7页,当前为第1页。 主服务器启动后还可以在主服务器里创建多个从服务器及房间,创建完成后从服务器的IP地址及端口号就作为它的唯一标识被同时写进数据库和主服务器的内存;房间号、房间所属的游戏类型、所属的从服务器号也作为房间的唯一标识被同时写进数据库和主服务器的内存。 从服务器创建以后就在它所属的机器上启动。 客户端登录后首先和主服务器建立连接(并且一直到客户端退出才断开)连接成功后生成界面结构树(前述),当用户点击某个游戏房间的时候系统从内存中读出这个房间的所有信息(前述),根据房间所属从服务器的IP地址及端口号试图和这个从服务器建立连接连接成功后相应的从服务器就将这个房间的所有信息发到这个客户端客户端收到以后就根据这些信息生成房间。每当有客户端的游戏位置发生改变的时候就向从服务器发送改变信息,从服务器保存、修改所有与它连接客户端的位置信息列表。 当一张桌子坐满时游戏开始。游戏开始后客户端也是和从服务器通信以更新游戏信息。 当客户端退出游戏后就回到大厅的这个房间,当退出大厅的时候首先和从服务器断开连接,然后和主服务器断开连接,最后终止整个客户端程序。 三、模块结构 系统包括三大主要模块结构:MainServer,LocalServer,Com.此外还有客户端安装,更新模块等。在三大主要模块结构中还有子DLL(动态链接库)模块。 1、MainServer(EXE项目):封装主服务器功能,包括管理客户端用户身份验证、登录以及管理从服务器的建立,数据库读写等。 2、LocalServer(EXE项目):封装从服务器功能,包括管理客户端游戏通信,游戏逻辑,大厅及房间等。 3、Com(EXE项目):封装客户端所有功能,包括客户端登录,大厅及房间,客户端游戏通信,游戏逻辑等。Com包括以下子模块: 客户端通用库PubLib(DLL模块)封装了客户端通用的调用接口,控件,类。供客户端所有的模块调用. 麻将游戏通用库MJLib(DLL模块)封装了客户端麻将游戏通用的调用接口类和十堰麻将类。通用的调用接口类供特殊的麻将游戏模块调用。 网络棋牌游戏服务器架构全文共7页,当前为第2页。扑克牌游戏通用库PisaLib(D

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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