请教大家两个有关WINSOCK控件通信的问题~(用TCP协议)

jackcaixia 2006-06-17 09:34:28
1.几个客户端通过WINDOCK发信息到服务端,由服务端完成一些操作再返回信息给客户端,但是如果几个客户端同时发信息到服务端的话就会造成混乱,请教高手们:如何令服务端逐个接收客户端信息,即完成一个客户请求后才接收下一个客户端请求~

2.服务端已经和几个客户端通过信(如A.B.C三个客户端),A客户端想向客户端B发出请求信息,则要提交请求到服务端,然后由服务端联系客户端B(因为客户端A不能直接联系上客户端B),但是:如何让服务端知道哪个客户端是A,哪个客户端是B,哪个客户端是C?

望高手们不吝赐教~~先谢了~~
...全文
379 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
WM_JAWIN 2006-06-26
  • 打赏
  • 举报
回复
用类模块与其相应winsock绑写
...
set myclass.winsock=winsock(id)
...

你的每一个类都代表一个客户.
zyg0 2006-06-25
  • 打赏
  • 举报
回复
其实因为是控件数组 它们都是调用自己的方法 自己处理 所以如果一个客户只是发送一个请求 就不用考虑服务器的问题 ,但是如果2一个客户端2葛请求 就需要客户端自己处理成一次一个请求了
vbfunner 2006-06-25
  • 打赏
  • 举报
回复
VirtualDesktop(吴滂)排队操作啊.设置目前状态码.
把客户请求保存.就象序列.处理完后就开始下一个.
例如:
dim NowClientIndex as integer '获得当前处理客户索引
type Client
ip as string
request as string
other as string
end type
设置数组大小Client(255)初始化nowclientindex=255
从尾部加入.client(255).ip="10.xx.xx.xx"
nowclientindex--;
释放客户对象时,++即可.
这个只是我主观臆断想出来的.错误肯定不少的.
我只能帮这么多了.
jackcaixia 2006-06-24
  • 打赏
  • 举报
回复
~
VirtualDesktop 2006-06-18
  • 打赏
  • 举报
回复
那你就建立一个全局变量标识当前服务器再做什么
然后排队操作啊
jackcaixia 2006-06-18
  • 打赏
  • 举报
回复
对~~就是这个意思~
letian_now 2006-06-18
  • 打赏
  • 举报
回复
mark
c4pt0r 2006-06-17
  • 打赏
  • 举报
回复
和楼上的楼上的楼上说的一样,建立动态控件组,我的思路是服务端建立N个WINSOCK控件,然后比如说从1000号端口开始侦听,就是1001,1002,1003,1004....1000+n,等待客户端连接,客户端从1000开始连接,如果连接失败则尝试1001,再失败则是1002,依次类推,直到连接为止,下面贴出代码~~~高一时候写的东西~~~见笑了~~~
服务端:
Private Sub Command1_Click()
On Error Resume Next
Dim sock As Variant
Dim port As Integer
Const max = 255
Dim strData As String

For i = 1 To max
Load Winsock(i)

Next i

n = 0
For Each sock In Winsock

DoEvents

If sock.State <> skclosed Then GoTo nextsock
sock.LocalPort = 2500 + n
sock.Listen
n = n + 1

nextsock:
Next sock

End Sub

Private Sub Winsock_ConnectionRequest(Index As Integer, ByVal requestID As Long)
On Error Resume Next
List1.AddItem Winsock(i).RemoteHostIP

Winsock(i).Close
Winsock(i).Accept requestID
End Sub

客户端:
Dim n As Integer


Private Sub Command1_Click()

If Winsock1.State <> 0 Then
Winsock1.Close
Do Until Winsock1.State = 0
DoEvents
Loop
End If

n = 0

Call connecting

End Sub

Sub connecting()
Winsock1.RemoteHost = ip

Winsock1.Connect , 2500 + n


End Sub

Private Sub Winsock1_Connect()

Winsock1.SendData Text2.Text

End Sub

Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
Winsock1.Close
n = n + 1
Call connecting


End Sub

希望能帮上忙
jackcaixia 2006-06-17
  • 打赏
  • 举报
回复
因为客户端请求的信息全部都是对数据库操作的~~而服务端收到信息对数据库操作后再返回客户端完成信息,如果几个客户端同时向服务端请求数据库操作的话,服务端一定会出错的~~所以要首先解决第一个问题~~
jackcaixia 2006-06-17
  • 打赏
  • 举报
回复
这个我知道~~现在最重要的是解决第一个问题~~如果这个问题解决不了的话你怎么设计数据报文的格式都没用~
province_ 2006-06-17
  • 打赏
  • 举报
回复
服务端可以建立多个WINSOCK控件(动态),同时你可以为每个控件附加上一个数据结构,里面保存各种你需要的信息。而客户端发送的消息需要你精心设计一些消息,以便使服务器知道客户的具体意图。实际上就是要你自己去设计数据报文的格式了。
c4pt0r 2006-06-17
  • 打赏
  • 举报
回复
楼主的意思是保证一个客户的请求得到处理,再处理另一个客户请求?
c4pt0r 2006-06-17
  • 打赏
  • 举报
回复
得到客户IP列表不是很容易啊~~~
province_ 2006-06-17
  • 打赏
  • 举报
回复
使用信号量表明当前正在做什么。然后就是排队等待操作。具体要你自己考虑。
另外,那个说高一就写程序的网友,你的服务端侦听可以只用一个WINSOCK来做,其他动态WINSOCK是用来与客户连接,不需要开那么多端口吧。
jackcaixia 2006-06-17
  • 打赏
  • 举报
回复
多谢各位的意见~~我也知道一定要用控件组~~但问题是我只有服务端一个数据库若干个表~~而客户端的所有操作都由服务端完成后再返回到客户端(即:客户端添加,修改,删除数据库记录都由客户端发送请求到服务端~再由服务端完成操作~~但是如果几个客户端同时发出请求对数据库中同一个表的操作的话服务端就会出错~~如服务端正在对一个表添加记录,而另一个客户端也对服务端发出添加记录请求的话就绝对会出错,因为那个表已经被打开而且锁定了)~~
我的意思是如何避免这种的问题?~~
fishboyok 2006-06-17
  • 打赏
  • 举报
回复
控件数组
VirtualDesktop 2006-06-17
  • 打赏
  • 举报
回复
建立控件数组即可
数组每个元素都会独立触发事件的啊

1,502

社区成员

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

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