局域网中可以 公网(互联网)上也可用服务端: Private Sub Form_Load() With Winsock1 .Protocol = sckUDPProtocol .LocalPort = XXX'服务端口号 .Bind XXX'服务端口号 End With End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '收到数据 Dim strdata As String Winsock1.GetData strdata, vbString '处理数据 比如转发给他人 end sub客户端: Private Sub Form_Load() With Winsock1 .Protocol = sckUDPProtocol .RemoteHost = XXX'服务IP .RemotePort = XXX'服务端口 End With End SubPrivate Sub command1_click() '发送数据 Winsock1.SendData "XXX" '发送的数据 End Sub这是最基本你要做成类似QQ那样的 还需要很大的工作量 比如 通信协议(例如B客户要发送给A客户) 数据库记录用户信息(比如用户身份信息 用户端的IP及端口等)
'客户端: Private Sub Form_Load() With Winsock1 .Protocol = sckUDPProtocol .RemoteHost = "212.96.128.86" '服务IP .RemotePort = 1001 '服务端口 End With End SubPrivate Sub command1_click() '发送数据 Winsock1.SendData Text2.Text '发送的数据 End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '收到数据 Dim strdata As String Winsock1.GetData strdata, vbString '处理数据 比如转发给他人 Text1.Text = strdata End Sub'服务端: Private Sub Form_Load() With Winsock1 .Protocol = sckUDPProtocol .RemoteHost = "156.29.54.246" '服务IP .LocalPort = 1001 '服务端口号 .Bind 1001 '服务端口号 End With End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '收到数据 Dim strdata As String Winsock1.GetData strdata, vbString '处理数据 比如转发给他人 Text1.Text = strdata End SubPrivate Sub command1_click() '发送数据 Winsock1.SendData Text2.Text '发送的数据 End Sub 这样两个程序在远程无法通讯.
修改为下面的也不行,只能在同一台机上可以,上到互联网就不行。 求高手指点迷津:A机:Private Sub Form_Load() With Winsock1 .Protocol = sckUDPProtocol .RemoteHost = "166.29.61.159" '远程主机IP .RemotePort = 1002 '远程主机端口 .LocalPort = 1001 '本地主机端口 .Bind 1001 '保留本地主机端口 End With 'Winsock1.Connect RemoteHost, RemotePort End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '收到数据 Dim strdata As StringOn Error Resume NextWinsock1.GetData strdata, vbString '处理数据 比如转发给他人 Text1.Text = Text1.Text & strdata & vbCrLfIf Err Then MsgBox "错误,可能是远程未启动。" ' handle the error here End IfEnd SubPrivate Sub command1_click() '发送数据 Winsock1.SendData Text2.Text '发送的数据 Text1.Text = Text1.Text & Text2.Text & vbCrLf Text2.Text = "" End SubB机:Private Sub Form_Load() With Winsock1 .Protocol = sckUDPProtocol .RemoteHost = "202.29.67.90" '远程主机IP .RemotePort = 1001 '远程主机端口 .LocalPort = 1002 '本地主机端口 .Bind 1002 '保留本地主机端口 End With 'Winsock1.Connect RemoteHost, RemotePort End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '收到数据 Dim strdata As StringOn Error Resume NextWinsock1.GetData strdata, vbString '获取远程发来的信息 '处理数据 比如转发给他人 Text1.Text = Text1.Text & strdata & vbCrLfIf Err Then MsgBox "错误,可能是远程未启动。" ' handle the error here End IfEnd SubPrivate Sub command1_click() '发送数据 Winsock1.SendData Text2.Text '发送的数据 Text1.Text = Text1.Text & Text2.Text & vbCrLf Text2.Text = "" End Sub
tcp/ip的我有个简单的例子代码,回复在别的贴上了,这里再帖一次吧. 外网访问其实和局域网访问是一样的: 局域网是 内网ip+使用的端口, 外网是 外网ip+使用的端口. 如果你是Adsl,那么每次重起电脑外网ip就会改变,那么你 就要下栽一个叫花生壳的软件来绑定一个域名,通过绑定的域 名就可以解析出你当前的外网ip. 如果你又用了家用路由器,那么你就要设置一下你的路由器, 在路由器上影射你局域网中要开放给外网的那台电脑的ip+使 用的端口.访问的时候还是:外网ip+使用的端口. 另外,我看了一下你的代码,好象有点问题,我发个代码给你 参考一下,vb6.0的: 服务端 Private Gac() As Boolean Dim Socknumber As Integer Private Sub Command1_Click(Index As Integer) Select Case Index Case 0 Winsock1(0).Close Unload Me Case 1 Command1(1).Enabled = False Command1(2).Enabled = True Winsock1(0).LocalPort = 2600 Winsock1(0).Listen Socknumber = 0 Frame1.Caption = "服务已经启动" Case 2 Command1(1).Enabled = True Command1(2).Enabled = False Winsock1(0).Close Text(0).Text = 0 Frame1.Caption = "服务已经停止" End Select End Sub Private Sub Form_Load() Command1(1).Enabled = True Command1(2).Enabled = False End Sub Private Sub Form_Unload(Cancel As Integer) Winsock1(0).Close End Sub Private Sub Winsock1_Close(Index As Integer) Winsock1(Index).Close Unload Winsock1(Index) Gac(Index) = False Text(0).Text = Int(Text(0).Text) - 1 End Sub Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long) Socknumber = Socknumber + 1
Load Winsock1(Socknumber) Winsock1(Socknumber).Accept requestID ReDim Preserve Gac(Socknumber) Gac(Socknumber) = True Text(0).Text = Int(Text(0).Text) + 1 End Sub Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long) Dim c As String Winsock1(Index).GetData c, vbString Dim i As Integer For i = 1 To UBound(Gac) If Not i = Index Then If Gac(i) Then Winsock1(i).SendData c DoEvents End If End If Next i
End Sub 客户端: Option Explicit Private Sub Command1_Click() Winsock1.RemoteHost = TextServerIP Winsock1.RemotePort = TextServerPost.Text Winsock1.Connect Command1.Enabled = False Do DoEvents Loop Until Winsock1.State = sckConnected Or Winsock1.State = sckError If Winsock1.State = sckError Then Command1.Enabled = True Winsock1.Close Text3.Text = "已与服务器连接失败" + Chr$(13) + Chr$(10) + Text3.Text Else
Text3.Text = "已与服务器连接成功" + Chr$(13) + Chr$(10) + Text3.Text Command2.Enabled = True Command3.Enabled = True End If End Sub Private Sub Command2_Click() Winsock1.SendData Text1.Text Text2.Text = "我说的话: " + Text1.Text + Chr$(13) + Chr$(10) + Text2.Text Text1.Text = "" End Sub Private Sub Command3_Click() Winsock1.Close Command1.Enabled = True Command2.Enabled = False Command3.Enabled = False Text3.Text = "已与服务器断开" + Chr$(13) + Chr$(10) + Text3.Text End Sub Private Sub Form_Load() Command1.Enabled = True Command2.Enabled = False Command3.Enabled = False
End Sub Private Sub Winsock1_Close() Command1.Enabled = True Command2.Enabled = False Command3.Enabled = False Winsock1.Close Text3.Text = "已与服务器断开" + Chr$(13) + Chr$(10) + Text3.Text
End Sub Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) Dim c As String Winsock1.GetData c, vbString Text2.Text = "对方说的话: " + c + Chr$(13) + Chr$(10) + Text2.Text End Sub
Private Sub Form_Load()
With Winsock1
.Protocol = sckUDPProtocol
.LocalPort = XXX'服务端口号
.Bind XXX'服务端口号
End With
End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
'收到数据
Dim strdata As String
Winsock1.GetData strdata, vbString
'处理数据 比如转发给他人
end sub客户端:
Private Sub Form_Load()
With Winsock1
.Protocol = sckUDPProtocol
.RemoteHost = XXX'服务IP
.RemotePort = XXX'服务端口
End With
End SubPrivate Sub command1_click()
'发送数据
Winsock1.SendData "XXX" '发送的数据
End Sub这是最基本你要做成类似QQ那样的 还需要很大的工作量 比如 通信协议(例如B客户要发送给A客户) 数据库记录用户信息(比如用户身份信息 用户端的IP及端口等)
每个客户端均有三个winsock控件,一个用于监听,一个用于与服务器的连接和会话,一个用于与其它客户端的连接和会话。
服务器有一个winsock控件和一个winsock控件数组,前者用于监听,后者用于处理连接和会话。
当客户端用处理连接和会话的控件向服务器端发往连接请求后,服务器端循环判断控件数组里是否有空闲的,如果没有,则动态增加一个,如果有,则使用它,接受客户端连接后,服务器端通过循环向每一个已连接的客户端发送当前所有已连客户端的IP地址,客户端接到后,刷新IP列表,然后由用户自己决定选择跟哪一个客户端会话,选择后,向对方客户端发送连接申请,接受后便可以进行客户端对客户端之间的通讯了。
如果想要实现同时与多个客户端进行通讯,将用于与其它客户端的连接和会话的winsock可设成控件数组即可。
Private Sub Form_Load()
With Winsock1
.Protocol = sckUDPProtocol
.RemoteHost = "212.96.128.86" '服务IP
.RemotePort = 1001 '服务端口
End With
End SubPrivate Sub command1_click()
'发送数据
Winsock1.SendData Text2.Text '发送的数据
End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
'收到数据
Dim strdata As String
Winsock1.GetData strdata, vbString
'处理数据 比如转发给他人
Text1.Text = strdata
End Sub'服务端:
Private Sub Form_Load()
With Winsock1
.Protocol = sckUDPProtocol
.RemoteHost = "156.29.54.246" '服务IP
.LocalPort = 1001 '服务端口号
.Bind 1001 '服务端口号
End With
End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
'收到数据
Dim strdata As String
Winsock1.GetData strdata, vbString
'处理数据 比如转发给他人
Text1.Text = strdata
End SubPrivate Sub command1_click()
'发送数据
Winsock1.SendData Text2.Text '发送的数据
End Sub
这样两个程序在远程无法通讯.
求高手指点迷津:A机:Private Sub Form_Load()
With Winsock1
.Protocol = sckUDPProtocol
.RemoteHost = "166.29.61.159" '远程主机IP
.RemotePort = 1002 '远程主机端口
.LocalPort = 1001 '本地主机端口
.Bind 1001 '保留本地主机端口
End With
'Winsock1.Connect RemoteHost, RemotePort
End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
'收到数据
Dim strdata As StringOn Error Resume NextWinsock1.GetData strdata, vbString
'处理数据 比如转发给他人
Text1.Text = Text1.Text & strdata & vbCrLfIf Err Then
MsgBox "错误,可能是远程未启动。" ' handle the error here
End IfEnd SubPrivate Sub command1_click()
'发送数据
Winsock1.SendData Text2.Text '发送的数据
Text1.Text = Text1.Text & Text2.Text & vbCrLf
Text2.Text = ""
End SubB机:Private Sub Form_Load()
With Winsock1
.Protocol = sckUDPProtocol
.RemoteHost = "202.29.67.90" '远程主机IP
.RemotePort = 1001 '远程主机端口
.LocalPort = 1002 '本地主机端口
.Bind 1002 '保留本地主机端口
End With
'Winsock1.Connect RemoteHost, RemotePort
End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
'收到数据
Dim strdata As StringOn Error Resume NextWinsock1.GetData strdata, vbString '获取远程发来的信息
'处理数据 比如转发给他人
Text1.Text = Text1.Text & strdata & vbCrLfIf Err Then
MsgBox "错误,可能是远程未启动。" ' handle the error here
End IfEnd SubPrivate Sub command1_click()
'发送数据
Winsock1.SendData Text2.Text '发送的数据
Text1.Text = Text1.Text & Text2.Text & vbCrLf
Text2.Text = ""
End Sub
和局域网一样 但是有路由后 你必须 牵扯到 UDP 打洞等 很麻烦 用TCP 吧
用TCP 很稳定 外网也是可以用的 但是 做聊天室的话 每次都通过服务器群发送
消息 这样服务器 会很占用资源 如果你还有不懂的 加我吧
消息 这样服务器 会很占用资源
楼上有什么好的技术思想,共享共享!
局域网是 内网ip+使用的端口,
外网是 外网ip+使用的端口.
如果你是Adsl,那么每次重起电脑外网ip就会改变,那么你
就要下栽一个叫花生壳的软件来绑定一个域名,通过绑定的域
名就可以解析出你当前的外网ip.
如果你又用了家用路由器,那么你就要设置一下你的路由器,
在路由器上影射你局域网中要开放给外网的那台电脑的ip+使
用的端口.访问的时候还是:外网ip+使用的端口.
另外,我看了一下你的代码,好象有点问题,我发个代码给你
参考一下,vb6.0的:
服务端
Private Gac() As Boolean
Dim Socknumber As Integer Private Sub Command1_Click(Index As Integer)
Select Case Index
Case 0
Winsock1(0).Close
Unload Me Case 1
Command1(1).Enabled = False
Command1(2).Enabled = True
Winsock1(0).LocalPort = 2600
Winsock1(0).Listen
Socknumber = 0
Frame1.Caption = "服务已经启动"
Case 2
Command1(1).Enabled = True
Command1(2).Enabled = False
Winsock1(0).Close
Text(0).Text = 0
Frame1.Caption = "服务已经停止"
End Select
End Sub Private Sub Form_Load()
Command1(1).Enabled = True
Command1(2).Enabled = False
End Sub Private Sub Form_Unload(Cancel As Integer) Winsock1(0).Close
End Sub Private Sub Winsock1_Close(Index As Integer)
Winsock1(Index).Close
Unload Winsock1(Index)
Gac(Index) = False
Text(0).Text = Int(Text(0).Text) - 1
End Sub Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Socknumber = Socknumber + 1
Load Winsock1(Socknumber)
Winsock1(Socknumber).Accept requestID
ReDim Preserve Gac(Socknumber)
Gac(Socknumber) = True
Text(0).Text = Int(Text(0).Text) + 1
End Sub Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim c As String
Winsock1(Index).GetData c, vbString
Dim i As Integer
For i = 1 To UBound(Gac)
If Not i = Index Then
If Gac(i) Then
Winsock1(i).SendData c
DoEvents
End If
End If
Next i
End Sub 客户端:
Option Explicit
Private Sub Command1_Click()
Winsock1.RemoteHost = TextServerIP
Winsock1.RemotePort = TextServerPost.Text
Winsock1.Connect
Command1.Enabled = False
Do
DoEvents
Loop Until Winsock1.State = sckConnected Or Winsock1.State = sckError
If Winsock1.State = sckError Then
Command1.Enabled = True
Winsock1.Close
Text3.Text = "已与服务器连接失败" + Chr$(13) + Chr$(10) + Text3.Text
Else
Text3.Text = "已与服务器连接成功" + Chr$(13) + Chr$(10) + Text3.Text
Command2.Enabled = True
Command3.Enabled = True
End If
End Sub Private Sub Command2_Click() Winsock1.SendData Text1.Text
Text2.Text = "我说的话: " + Text1.Text + Chr$(13) + Chr$(10) + Text2.Text
Text1.Text = "" End Sub Private Sub Command3_Click()
Winsock1.Close
Command1.Enabled = True
Command2.Enabled = False
Command3.Enabled = False
Text3.Text = "已与服务器断开" + Chr$(13) + Chr$(10) + Text3.Text
End Sub Private Sub Form_Load() Command1.Enabled = True
Command2.Enabled = False
Command3.Enabled = False
End Sub Private Sub Winsock1_Close()
Command1.Enabled = True
Command2.Enabled = False
Command3.Enabled = False
Winsock1.Close
Text3.Text = "已与服务器断开" + Chr$(13) + Chr$(10) + Text3.Text
End Sub Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim c As String
Winsock1.GetData c, vbString
Text2.Text = "对方说的话: " + c + Chr$(13) + Chr$(10) + Text2.Text
End Sub