Winsock 做的网络通讯接受不到数据!

mawenxi_715 2009-08-27 11:19:16
我在VB中用WINSOCK控件做一个通讯程序,由于条件限制,我的服务器和客户机都是我自己的电脑,服务器和客户机各用一个窗体,每个空间里分别有一个WINSOCK控件,程序编写好后,客户机发送请求的时候,主机已经接受到客户机的请求了,因为TEXT3.TEXT已经变为了“已经建立连接”,然后只是在服务器发送区发送数据后,客户机一点反应也没有,


服务器程序如下:

Private Sub Form_Load()

Winsock1.LocalPort = 8888
Winsock1.Listen


Form4.Show

End Sub

//对网络端口初始化



Private Sub winsock1_connectionrequest(ByVal requestid As Long)

If Winsock1.State <> sckClosed Then
Winsock1.Close
Winsock1.Accept requestid

Text3.Text = "已经建立连接"
End If

End Sub

//等待客户机发来的请求,程序运行结果,TEXT3已经变为“已经建立连接”,也就说已经收到客户机的连接请求了


Private Sub text1_change()



Winsock1.SendData Text1.Text

End Sub

//在TEXT1中输入数据,正好触发Text_change事件,发送数据到客户机


客户机程序如下:

Winsock2.RemoteHost = "localhost"
Winsock2.RemotePort = 8888


End Sub

Private Sub cmdconnect_click()

Winsock2.Connect

End Sub





Private Sub winscok2_dataarrival(ByVal bytestotal As Long)

Dim strdata As String
Winsock2.GetData strdata, vbString
Text2.Text = strdata



End Sub


运行结果就是在服务器发送数据,客户机接受区是空白,不过也没报错。请各位高人,帮我看看什么原因造成的?



...全文
210 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
骚军 2009-08-28
  • 打赏
  • 举报
回复
照着你的程序做,为什么我的就能收到数据呢? 是不是你自己还不够细心啊~!· 我最近也一直在研究winsock的通讯问题~
liguicd 2009-08-28
  • 打赏
  • 举报
回复
学习中...
现在还是人类 2009-08-27
  • 打赏
  • 举报
回复
大概是用类似的方法。
最好在建立数组对象的时候做一个比较完善的过程,
如通过自定义的类型数组来做控件数组元素的识别。

Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
If Winsock1(Index).State <> 0 Then Winsock1(Index).Close
Winsock1(Index).Accept requestID
Load Winsock1(Index + 1)
Winsock1(Index + 1).LocalPort = 你的端口
Winsock1(Index + 1).Listen
End Sub

以上只是说明理论,实际上不能这么用
倒大霉的上帝 2009-08-27
  • 打赏
  • 举报
回复
没出错的原因:

Text3.Text = "已经建立连接" 'Text3中修改的数据
Private Sub text1_change() '调用的是Text1的Change时间 Text1就没改变过内容
Winsock1.SendData Text1.Text '发送的是Text1的内容。 Text1内容还是为空(或默认值)

如果上述问题统一成Text3
则会出现错误。原因:
Text3.Text = "已经建立连接" 赋值在服务器端的winsock1_connectionrequest事件(连接请求事件)中。此时客户端的Winsock.state值为6,既还在连接状态(连接还没完全完成)。这时Text3的内容改变了,并在服务器端发送消息,客户端肯定接收不了(因为客户端此时的链接状态还是6)。正确的方法如下:
服务器端:

'服务器端代码
Private Sub Command1_Click() '添加一个command的控件
Winsock1.SendData Text3.Text
End Sub

Private Sub Form_Load()

Winsock1.LocalPort = 8888
Winsock1.Listen
End Sub

Private Sub winsock1_connectionrequest(ByVal requestid As Long)
If Winsock1.State <> sckClosed Then
Winsock1.Close
Winsock1.Accept requestid
Text3.Text = "已经建立连接"
End If
End Sub


客户端:

'客户端代码
Private Sub Form_Load()
Winsock2.RemoteHost = "localhost"
Winsock2.RemotePort = 8888
End Sub

Private Sub cmdconnect_click()
Winsock2.Connect
End Sub
Private Sub winscok2_dataarrival(ByVal bytesTotal As Long)
Dim strdata As String
Winsock2.GetData strdata, vbString
Text2.Text = strdata
End Sub
Private Sub Winsock2_Connect()
cmdconnect.Enabled = False
End Sub
Private Sub Winsock2_DataArrival(ByVal bytesTotal As Long)
Dim strdata As String
Winsock2.GetData strdata, vbString
Text2.Text = strdata
End Sub




zhh0086 2009-08-27
  • 打赏
  • 举报
回复
最近在tcp,ftp发送文件的方式,发现用个ftp控件来发送文件很方便,tcp在发送大文件的时候有溢出的可能性,所以就要考虑分包发送机制,还是有些麻烦,发送的过程中如果丢包怎么办呢,偶还没有处理好这个问题
ltpao 2009-08-27
  • 打赏
  • 举报
回复
Winsock1改为控件数组,在ConnectionRequest加载新的Winsock,用新生成的Winsock去Accept并发送接收数据
chinaboyzyq 2009-08-27
  • 打赏
  • 举报
回复
Private Sub winscok2_dataarrival(ByVal bytestotal As Long)
Dim strdata As String
Winsock2.GetData strdata, vbString
Text2.Text = strdata
End Sub
此处笔误

chinaboyzyq 2009-08-27
  • 打赏
  • 举报
回复
Private Sub winscok2_dataarrival(ByVal bytestotal As Long)
Dim strdata As String
Winsock2.GetData strdata, vbString
Text2.Text = strdata
End Sub
改成:
Private Sub Winsock2_DataArrival(ByVal bytesTotal As Long)
Dim strdata As String
Winsock2.GetData strdata, vbString
Text2.Text = strdata

End Sub
现在还是人类 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ltpao 的回复:]
3楼搞反了,Index最小的应该是侦听端口
Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
  Load Winsock1(Index + 1)
  Winsock1(Index + 1).Accept requestID
End Sub
在DataArrival事件中Index + 1会收到数据
[/Quote]
没反呀

Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
'这是处理当前的连接状态,能到这一步,说明这个元素原来是侦听状态了
If Winsock1(Index).State <> 0 Then Winsock1(Index).Close
'让当前的这个元素接受远程的连接
Winsock1(Index).Accept requestID
'既然唯一一个侦听状态的元素都变成连接状态了,那么就没东西侦听新的远程连接请求了
'所以这里新建出一个元素,当然以下的方法是随便写的,在理论上如果当前的元素编号是1
'那么Index+1就是一个新的元素了(不去考虑其他的先)
Load Winsock1(Index + 1) '这里就加载了新的数组元素
'新建了数组元素后,就开始让新的数组元素进入侦听状态了
Winsock1(Index + 1).LocalPort = 你的端口
Winsock1(Index + 1).Listen
End Sub
ltpao 2009-08-27
  • 打赏
  • 举报
回复
3楼搞反了,Index最小的应该是侦听端口
Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Load Winsock1(Index + 1)
Winsock1(Index + 1).Accept requestID
End Sub
在DataArrival事件中Index + 1会收到数据
倒大霉的上帝 2009-08-27
  • 打赏
  • 举报
回复
没代码 看不出什么玩意。
mawenxi_715 2009-08-27
  • 打赏
  • 举报
回复
谢谢,我按照你的程序重新调整了一下,我加了一个功能,读WINSOCK2.STATE 值,读的值变为7后,我为我才发送数据,结果数据还是接受不到,是一个空的

1,502

社区成员

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

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