老师让做一个socket 实现主机和客户机的通信 我从网上下载了一个代码 但是运行以后不太对 请各位大侠帮帮忙阿!!

l_john2000 2006-04-12 10:15:34
1)Command1:退出按钮;

  (2)textsend:发送数据文本框;

  (3)Winsockserver: 服务器Winsock;

  (4)textget :接收数据文本框。

  服务器程序的界面如图所示。

  服务器程序的源代码如下:

  Private Sub Command1_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

  客户机程序使用的控件如下:

  (1)Command1:退出按钮;

  (2)Command2:连接按钮;

  (3)Winsockclient:客户Winsock;

  (4)Text1:主机名文本框;

  (5)Textsend:发送数据文本框;

  (6)Textget:接收数据文本框;   客户机程序的界面如图所示。

  客户机程序的源代码如下:

  Private Sub Command1_Click()

   End

  End Sub

  

  Private Sub Command2_Click()

   Winsockclient.Connect

  End Sub

  

  Private Sub Form_Load()

   textsend.Visible = False

   textget.Visible = False

   Winsockclient.RemotePort = 1001

   Winsockclient.RemoteHost = "sccdsz"

  End Sub

  

  Private Sub Text1_Change()

   Winsockclient.RemoteHost = Text1.Text

  End Sub

  

  Private Sub textsend_Change()

   Winsockclient.SendData textsend.Text

  End Sub

  

  Private Sub Winsockclient_Close()

   Winsockclient.Close

   End

  End Sub

  

  Private Sub winsockclient_Connect()

   textsend.Visible = True

   textget.Visible = True

   Command2.Visible = False

  End Sub

  

  Private Sub winsockclient_DataArrival(ByVal bytesTotal As Long)

   Dim tmpstr As String

   Winsockclient.GetData tmpstr

   textget.Text = tmpstr

  End Sub
...全文
487 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
l_john2000 2006-04-12
  • 打赏
  • 举报
回复
是服务器报错
“未找到犯方法或数据成员”
jackcaixia 2006-04-12
  • 打赏
  • 举报
回复
是客户端报错吗?~~提示那一句错误 ?
l_john2000 2006-04-12
  • 打赏
  • 举报
回复
又出现一个问题
当你关闭服务器端的时候
Private Sub Form_Unload(Cancel As Integer)
If Me.sckClient.State = 7 Then Me.sckClient.Close
' sckClient.SendData "QUIT"
End Sub
Private Sub Command1_Click()
sckclient.sendata text2.text
End Sub
Private Sub Command2_Click()
end
End Sub


会报错 未找到犯方法或数据成员 是不是因为没有定义count
l_john2000 2006-04-12
  • 打赏
  • 举报
回复
测试已经成功
l_john2000 2006-04-12
  • 打赏
  • 举报
回复
.SckServer(0).LocalPort = 1001 '本地端口
.SckServer(0).Listen '开始监听
好像不太对阿
Private Sub sckServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim strData As String
SckServer(Index).GetData strData
Text1.Text = strData
End If
End Sub
这个里面都没有if子句 怎么就end if 呢?
jackcaixia 2006-04-12
  • 打赏
  • 举报
回复
服务端这里
Private Sub sckServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim strData As String
SckServer(Index).GetData strData
Text1.Text = strData
End If
End Sub
的end if 这句不要~打多了
l_john2000 2006-04-12
  • 打赏
  • 举报
回复
ok
谢谢阿
jackcaixia 2006-04-12
  • 打赏
  • 举报
回复
服务端这里
Private Sub sckServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim strData As String
SckServer(Index).GetData strData
Text1.Text = strData
End If
End Sub

这里的text1.text=strdata下面你可以加一句
sckserver.sendata "OK"

就是服务端接收到客户端发来的信息后在服务端的TEXT1中显示出来~再向客户端发送"OK"信息
客户端的TEXT1就会显示"OK"
jackcaixia 2006-04-12
  • 打赏
  • 举报
回复
而客户端里的command1按钮就用来发送信息的~~也就是说我的代码里的客户端既可以发信息也可以接收信息~~就是这个机器即使客户机又是服务器
jackcaixia 2006-04-12
  • 打赏
  • 举报
回复
你没看到我的代码的客户端里的这段代码吗?服务端也有的~~
Private Sub sckClient_DataArrival(ByVal bytesTotal As Long)
On Error Resume Next
Dim strData As String
sckClient.GetData strData
Text1.Text = strData
End Sub
这段代码就是接收信息的~~
text1.text=strdata是显示接收到的数据~~接收到信息后具体怎样做就要看你要实现什么功能了~
l_john2000 2006-04-12
  • 打赏
  • 举报
回复
那怎么实现一个机器的通信
就是这个机器即使客户机又是服务器
zyg0 2006-04-12
  • 打赏
  • 举报
回复
msdn中的winsock空间的说明中有1个tcp的离子 服务器只要有固定ip就可以使用在互联网上
l_john2000 2006-04-12
  • 打赏
  • 举报
回复
谢谢阿
jackcaixia 2006-04-12
  • 打赏
  • 举报
回复
服务端:添加一个winsock控件(名为:sckserver),一个text控件(名为text1)用来显示接收到的信息。代码如下:
Private Sub form_Load()
With Me
.SckServer(0).LocalPort = 1001 '本地端口
.SckServer(0).Listen '开始监听
End With
End Sub

Private Sub Form_Unload(Cancel As Integer)
Dim i As Long
For i = 1 To SckServer.Count - 1
If SckServer(i).State = 7 Then
SckServer(i).Close
End If
Next
SckServer(0).Close

End Sub

Private Sub SckServer_Close(Index As Integer)
Me.SckServer(Index).Close
Me.SckServer(Index).Tag = ""
End Sub

Private Sub sckServer_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Dim i As Long, l As Boolean, cou As Long, flag As Long
cou = 0
For i = 1 To Me.SckServer.Count - 1
If Me.SckServer(i).State = 0 And Not l Then
Me.SckServer(i).Accept (requestID)
flag = i
l = True
Else
cou = cou + 1
End If
Next
If Not l Then
i = Me.SckServer.Count
Load Me.SckServer(i)
flag = i
Me.SckServer(i).Accept (requestID)
End If

End Sub
Private Sub sckServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim strData As String
SckServer(Index).GetData strData
Text1.Text = strData
End If
End Sub

Private Sub SckServer_Error(Index As Integer, 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)
Call SckServer_Close(Index)
End Sub


客户端:添加一个winsock控件(名为sckclient),添加2个text控件(名为text1和text2),text1用来显示是否和服务器连接成功的信息,TEXT2则用来写发送到服务端的信息,2个command按钮控件(名为command1和command2)command1用来发送信息到服务端,command2则为退出.



Private Sub form_Load()
With Me
.sckClient.RemoteHost = "192.168.0.46" '设置远程IP,本例设为本机。
.sckClient.RemotePort = 1001 '远程端口,就为server中的设置一样.
End With
sckClient.Connect
Text1.Text = "正在测试连接....."
End Sub

Private Sub Form_Unload(Cancel As Integer)
If Me.sckClient.State = 7 Then Me.sckClient.Close
' sckClient.SendData "QUIT"
End Sub
Private Sub Command1_Click()
sckclient.sendata text2.text
End Sub
Private Sub Command2_Click()
end
End Sub

Private Sub sckClient_Close()
sckClient.Close
Text1.Text = "服务器未开启"
End Sub

Private Sub sckClient_Connect()
Text1.Text = "连接成功"
End Sub

Private Sub sckClient_ConnectionRequest(ByVal requestID As Long)
With Me
If .sckClient.State <> sckClosed Then .sckClient.Close
.sckClient.Accept (requestID)
End With
End Sub

Private Sub sckClient_DataArrival(ByVal bytesTotal As Long)
On Error Resume Next
Dim strData As String
sckClient.GetData strData
Text1.Text = strData
End Sub

Private Sub sckClient_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)
Call sckClient_Close
End Sub

本代码经过测试~~绝对没问题~~
l_john2000 2006-04-12
  • 打赏
  • 举报
回复
怎么解决呢
jackcaixia 2006-04-12
  • 打赏
  • 举报
回复
这样的代码确定有问题的~~
l_john2000 2006-04-12
  • 打赏
  • 举报
回复
Dim i As Long
For i = 1 To SckServer.Count - 1
If SckServer(i).State = 7 Then
SckServer(i).Close
End If
Next
这句是什么意思?有这个SckServer.Count方法吗?
报错的时候说未找到方法或数据成员
l_john2000 2006-04-12
  • 打赏
  • 举报
回复

我这个是在服务器端编写程序好程序让其运行,运行后什么都不做将其关闭就会报错
另外我还有一个问题 SckServer(0)中(0)这是什么意思? 不是在服务器端定义了一个winsock控件吗???
jackcaixia 2006-04-12
  • 打赏
  • 举报
回复
真是奇怪~~在我那里没问题哦~~而且这些代码经过很多几台机测试过都没问题咯~~

1,502

社区成员

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

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