我写了一个一对一的通信程序,现在想改成一对多通信,碰到不少问题,如winsock数组使用问题,端口的load和close问题,网上查了不少资料,都是什么主要程序代码,根本不管用,连MSDN的例子也走不通,谁能帮我改成一对多的程序,就给谁分,要求用TCP的。我的程序如下:客户端界面:两个text窗口,一个winsock控件,三个按钮:连接、发送、退出
Private Sub Cmdexit_Click()
End
End Sub
Private Sub Cmdconnect_Click()
Winsockclient.Connect
End Sub Private Sub Cmdsend_Click()
Winsockclient.SendData textsend.Text
End Sub Private Sub Form_Load()
Dim IP As String
IP = InputBox("请输入要连接的IP", "输入的IP", "127.0.0.1") '连接的IP默认为本机
Winsockclient.RemoteHost = IP '1、设置RemoteHost,即你要连接IP textsend.Visible = False
textget.Visible = False
Winsockclient.RemotePort = 1001
End Sub
Private Sub Text1_Change()
Winsockclient.RemoteHost = Text1.Text
End Sub
Private Sub Winsockclient_Close()
Winsockclient.Close
End
End Sub
Private Sub winsockclient_Connect()
textsend.Visible = True
textget.Visible = True
End Sub
Private Sub winsockclient_DataArrival(ByVal bytesTotal As Long)
Dim tmpstr As String
Winsockclient.GetData tmpstr
textget.Text = tmpstr
End Sub服务器端界面:两个text窗口,一个winsock控件,一个退出按钮
Private Sub Cmdexit_Click()
End
End Sub
Private Sub Form_Load()
textsend.Visible = False
textget.Visible = False
Winsockserver.LocalPort = 1001
Winsockserver.Listen
End Sub Private Sub textsend_Change()
Winsockserver.SendData textsend.Text
End Sub
Private Sub Winsockserver_Close()
Winsockserver.Close
End
End Sub
Private Sub Winsockserver_ConnectionRequest(ByVal requestID As Long)
textsend.Visible = True
textget.Visible = True
If Winsockserver.State <> sckClosed Then Winsockserver.Close
Winsockserver.Accept requestID
End Sub
Private Sub Winsockserver_DataArrival(ByVal bytesTotal As Long)
Dim tmpstr As String Winsockserver.GetData tmpstr
textget.Text = tmpstr
End Sub
Private Sub Cmdexit_Click()
End
End Sub
Private Sub Cmdconnect_Click()
Winsockclient.Connect
End Sub Private Sub Cmdsend_Click()
Winsockclient.SendData textsend.Text
End Sub Private Sub Form_Load()
Dim IP As String
IP = InputBox("请输入要连接的IP", "输入的IP", "127.0.0.1") '连接的IP默认为本机
Winsockclient.RemoteHost = IP '1、设置RemoteHost,即你要连接IP textsend.Visible = False
textget.Visible = False
Winsockclient.RemotePort = 1001
End Sub
Private Sub Text1_Change()
Winsockclient.RemoteHost = Text1.Text
End Sub
Private Sub Winsockclient_Close()
Winsockclient.Close
End
End Sub
Private Sub winsockclient_Connect()
textsend.Visible = True
textget.Visible = True
End Sub
Private Sub winsockclient_DataArrival(ByVal bytesTotal As Long)
Dim tmpstr As String
Winsockclient.GetData tmpstr
textget.Text = tmpstr
End Sub服务器端界面:两个text窗口,一个winsock控件,一个退出按钮
Private Sub Cmdexit_Click()
End
End Sub
Private Sub Form_Load()
textsend.Visible = False
textget.Visible = False
Winsockserver.LocalPort = 1001
Winsockserver.Listen
End Sub Private Sub textsend_Change()
Winsockserver.SendData textsend.Text
End Sub
Private Sub Winsockserver_Close()
Winsockserver.Close
End
End Sub
Private Sub Winsockserver_ConnectionRequest(ByVal requestID As Long)
textsend.Visible = True
textget.Visible = True
If Winsockserver.State <> sckClosed Then Winsockserver.Close
Winsockserver.Accept requestID
End Sub
Private Sub Winsockserver_DataArrival(ByVal bytesTotal As Long)
Dim tmpstr As String Winsockserver.GetData tmpstr
textget.Text = tmpstr
End Sub
解决方案 »
- 我想自学VB想买本书看,不知道买什么书好?
- winsock连接问题?
- 我已用 waveInOpen 函数成功打开设备,并成功发送了数据缓冲区,在得到数据后又遇到一些问题,请高手指教,谢谢!
- 问了许久,没有人回答,不知道是不是都没遇到过,再来问一遍,急!!!在线等!!!
- 下面错误显示的是什么意思呢?请高手详细指教一下应该如何修复错误?
- 求一段详细的“添加记录”和“删除记录”按钮实现功能的代码,拜谢!!
- 如何将一个现有的记录集(RecordSet)动态绑定到数据网格(DataGrid)!
- 谁知道那里有卖低密3。5inch软盘
- 把一个文件夹内的所有文件拷贝到另一个件夹怎么办?
- 哪位大哥帮翻译一句话!非常感谢!!!!!!!!!!
- 如何实现这样查询顺丰单号
- 我在Access中可以通过的这条SQL语句,怎么在VB中就通不过了呢?
'msdn上写得比较清楚:
'接受多个连接请求
'上面设计的基本服务器只能接受一个连接请求。通过创建控件数组,使用一个控件也可以同时接受多个连接请
'求。利用这种方法,不需要关闭连接,而只需创建新的控件实例(通过设置其索引属性),然后在新的实例上
'调用 Accept 方法。'下面的代码假定名为 sckServer 的窗体上有一个 Winsock 控件,它的 Index 属性被设置为 0;因此控
'件是控件数组的一部分。在声明部分,声明了一个模块级的变量 intMax。在窗体的 Load 事件中,
'intMax 被设置为 0,数组中第一个控件的 LocalPort 属性被设置为 1001。然后调用控件的 Listen 方
'法,使之成为“监听”控件。在连接请求到达时,代码将检测 Index 是否为 0(“监听”控件的值)。如果
'为 0,监听控件将增加 intMax 的值,并使用该号码来创建新的控件实例。然后,使用新的控件实例接受连
'接请求。Private intMax As LongPrivate Sub Form_Load()
intMax = 0
sckServer(0).LocalPort = 1001
sckServer(0).Listen
End SubPrivate 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 SubPrivate Sub sckserver_Close(Index As Integer)
sckserver(Index).Close
unload sckserver(Index)
End Sub
你有QQ的话,加一下,我好和你聊聊
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当打开第二个客户端时,报错:控件数组元素“2” 不存在,郁闷吧
不知道是你晕,还是我晕……这里按以上结构你只能有一个wsck(0),wsck(0)以外都是自动建立的,根本用不着你去人工建立用于传输的wsck(1)!话又说回来了,MSDN上的这个例子,只给了个概貌,这里没有给你如何处理断开以后如何销毁控件,以后如何再添加控件,我给你加销毁部分,并没给你加以后再添加的程序,这是你自己要解决的。如果你根本看不懂以上程序,建议你服务器端程序,直接开多个winsock与你的客户端一一对应,也未尝不可。
按你说的做了,结果第一个客户端就就打不开,报错:控件数组元素“1” 不存在
当然我的客户端也有一个winsock,不会连这个也不要吧,还有你说给我加销毁部分程序,没贴出来啊
说一千道一万都没用,连基本的协议都不懂说什么,LZ还是先看看书,再看程序!你要用Winsock实施通信,在握手之前必须有发出端口和接收端口,看不懂自动生成的,就用最原始的方法一个一个手工加载控件,再在程序运行前手工设置好或者运行时代码中设定参数。
通信前确保有接收的和发送的!先别管是控件数组还是单纯控件!
你有QQ的话,加一下,我好和你聊聊
//我晕死.......不可能是你吧,只是同名同职而已吧.05年我与姚工在一个公司呢!我的代码只是传送文件的示例,演示的是多客户端的例子,你的应用需要再写别的代码.
呵呵,是newtone吗?我05年在那里
首先感谢各位大虾的指点。
本人原来是电子工程师,后改做软件调试,最近被老板逼着做系统开发,而且时间有限,没空去研究TCP是四层协议或是7层协议中详细描述,所以想求一段现成的程序,再进行加工改编,热心人不少,可是也有不少淘江湖的朋友,浪费彼此时间。
在这里尤其感谢myjian和xiwei,对我帮助很大,其中xiwei的程序之精练,让人叹为观止,客户端和服务端加起来都没有超过50句,真是高手啊,读他的程序,不仅收益很大,而且是一种享受。