我是菜鸟,刚开始用WINSOCK
写程序的时候,winsock打开连接后,sendData只能执行一次,如果不close connection的话,就无法执行sendData,提示连接状态错误。听说可以连续sendData,具体哪部操作没有执行,请教,帮帮忙!或者有没有WINSOCK的教程介绍给小弟,英文、中文都没关系,多谢先啦
写程序的时候,winsock打开连接后,sendData只能执行一次,如果不close connection的话,就无法执行sendData,提示连接状态错误。听说可以连续sendData,具体哪部操作没有执行,请教,帮帮忙!或者有没有WINSOCK的教程介绍给小弟,英文、中文都没关系,多谢先啦
'着要看具体问题的,下面只是一个简单的例子 我也没调试过
Private m_strBuff() As String '发送数据的缓冲区
Private m_CurBuffIndex As Integer '当前发送第几个数据Private Sub Command1_Click()
'假设所有要发送的数据都存在m_strBuff数组里面了
m_CurBuffIndex = 0 '先发送第一个
Winsock1.SendData m_strBuff(m_CurBuffIndex)
End Sub
Private m_CurBuffIndex As Integer '当前发送第几个数据Private Sub Command1_Click()
'假设所有要发送的数据都存在m_strBuff数组里面了
m_CurBuffIndex = 0 '先发送第一个
Winsock1.SendData m_strBuff(m_CurBuffIndex)
End SubPrivate Sub Winsock1_SendComplete()
'发送完毕 接着发
m_CurBuffIndex = m_CurBuffIndex + 1
If m_CurBuffIndex <= UBound(m_strBuff) Then
Winsock1.SendData m_strBuff(m_CurBuffIndex)
Else
'm_strBuff数组的数据全部发送完毕
'初始化m_CurBuffIndex m_strBuff
m_CurBuffIndex = 0
ReDim m_strBuff(0)
End If
End Sub
将缺省窗体的名称改为 frmServer。
将窗体的标题改为“TCP 服务器”。
在窗体中放入一个 Winsock 控件,并将它的名字改为 tcpServer。
在窗体上添加两个 TextBox 控件。将第一个命名为 txtSendData,第二个为 txtOutput。
为窗体添加如下的代码。
Private Sub Form_Load()
'将 LocalPort 属性设置为一个整数。
'然后调用 Listen 方法。
tcpServer.LocalPort = 1001
tcpServer.Listen
frmClient.Show '显示客户端的窗体。
End SubPrivate Sub tcpServer_ConnectionRequest _
(ByVal requestID As Long)
'检查控件的 State 属性是否为关闭的。
'如果不是,
'在接受新的连接之前先关闭此连接。
If tcpServer.State <> sckClosed Then _
tcpServer.Close
'接受具有 requestID 参数的
'连接。
tcpServer.Accept requestID
End SubPrivate Sub txtSendData_Change()
'名为 txtSendData 的 TextBox 控件中
'包含了要发送的数据。当用户往文本框中
'键入数据时,使用 SendData 方法
'发送输入的字符串。
tcpServer.SendData txtSendData.Text
End SubPrivate Sub tcpServer_DataArrival _
(ByVal bytesTotal As Long)
'为进入的数据声明一个变量。
'调用 GetData 方法,并将数据赋予名为 txtOutput
'的 TextBox 的 Text 属性。
Dim strData As String
tcpServer.GetData strData
txtOutput.Text = strData
End Sub上面的步骤创建了一个简单的服务器应用程序。为了使它能够工作,还必须为它创建一个客户端的应用程序。要创建 TCP 客户端,请按照以下步骤执行: 在工程中添加一个新的窗体,将其命名为 frmClient。
将窗体的标题改为“TCP Client”。
在窗体中添加一个 Winsock 控件,并将其命名为 tcpClient。
在 frmClient 中添加两个 TextBox 控件。将第一个命名为 txtSend,第二个为 txtOutput。
在窗体上放一个 CommandButton 控件,并将其命名为 cmdConnect。
将 CommandButton 控件的标题改为 Connect。
在窗体中添加如下的代码。
重点 必须将 RemoteHost 属性值修改为您的计算机的名字。Private Sub Form_Load()
'Winsock 控件的名字为 tcpClient。
'注意:要指定远程主机,可以使用
' IP 地址(例如:"121.111.1.1"),也可以使用
'计算机的“好听的名字”如下所示。
tcpClient.RemoteHost = "RemoteComputerName"
tcpClient.RemotePort = 1001
End SubPrivate Sub cmdConnect_Click()
'调用 Connect 方法,初始化连接。
tcpClient.Connect
End SubPrivate Sub txtSendData_Change()
tcpClient.SendData txtSend.Text
End SubPrivate Sub tcpClient_DataArrival _
(ByVal bytesTotal As Long)
Dim strData As String
tcpClient.GetData strData
txtOutput.Text = strData
End Sub上面的代码创建了一个简单的客户/服务器模式的应用程序。我们可以将两者都运行起来:运行工程,然后单击“连接”。在两个窗体之一的 txtSendData 文本框中键入文本,可以看到同样的文字将出现在另一个窗体的 txtOutput 文本框中
用数组来作为sendData的缓冲区,就可以多次发送数据了吗?楼上,你这个只是WINSOCKET的简单入门吧,有没有详细的WINSOCKET的资料
那些乱码只是些注释来的
Option Explicit
Dim timer_Begin
Dim iTotal_Bytes_Recieve As Double, iTotal_Bytes As Double
Dim blGet_First As BooleanPrivate Sub init()
sFile_Content.Text = ""
iTotal_Bytes_Recieve = 0
blGet_First = True
If socket_thief.State = 0 Then init_thief
End SubPrivate Sub init_thief()
'init socket_thief
With socket_thief
.RemoteHost = strHost.Text
.RemotePort = intPort.Text
.Protocol = sckTCPProtocol
End With
End SubPrivate Sub Request_Send(sURL)
Dim sCmd
status_show "send request..."
sCmd = "GET " + sURL + " HTTP/1.0" + vbCrLf 'GET ΪFTPÃüÁî
sCmd = sCmd + "Accept: */*" + vbCrLf 'Õâ¾ä¿ÉÒÔ²»Òªs
sCmd = sCmd + "Accept: text/html" + vbCrLf 'Õâ¾ä¿ÉÒÔ²»Òª
sCmd = sCmd + vbCrLf '¼Çסһ¶¨Òª¼ÓÉÏvbCrLf
socket_thief.SendData sCmd
timer_Begin = Timer()
End SubPrivate Sub cmdConnection_Click()
status_show "ready.."
If socket_thief.State <> 0 Then
'socket_thief.Close
Request_Send (strURL.Text)
Else
init
socket_thief.Connect
End If
End SubPrivate Sub Form_Load()
strURL.Text = "http://baby.zjjs.net/test_http.asp"
iTotal_Bytes_Recieve = 0
End SubPrivate Sub socket_thief_Close()
'socket_thief.Close
status_show "closed ×ÜÓÃʱ£º" & (Timer() - timer_Begin) & " ×ÜÏÂÔØ×Ö½ÚÊý£º" & iTotal_Bytes_Recieve
End SubPrivate Sub socket_thief_Connect()
Request_Send (strURL.Text)
End SubPrivate Sub socket_thief_DataArrival(ByVal bytesTotal As Long)
Dim sBuffer As String
Dim iPtr As Integer
status_show "loading........"
socket_thief.GetData sBuffer, vbString
iTotal_Bytes_Recieve = iTotal_Bytes_Recieve + bytesTotal
If blGet_First = False Then
Else
'test
iPtr = InStr(sBuffer, "Content-Length:") + Len("Content-Length:")
If iPtr > 0 Then
If Len(iPtr) > 0 Then iTotal_Bytes = Mid(sBuffer, iPtr, InStr(iPtr + 1, sBuffer, vbCrLf) - iPtr)
iPtr = InStr(sBuffer, vbCrLf & vbCrLf)
sBuffer = Right(sBuffer, Len(sBuffer) - iPtr - 2)
iTotal_Bytes_Recieve = iTotal_Bytes_Recieve - iPtr - 2
End If
blGet_First = False
End If
sFile_Content.Text = sFile_Content.Text + sBuffer
End SubPrivate Sub socket_thief_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)
MsgBox Description
End SubPrivate Sub status_show(str)
sStatus.Caption = str & vbCrLf & "sock state = " & socket_thief.State & " total_bytes = " & iTotal_Bytes
End SubPrivate Sub strURL_Change()
'reSet Host & File .Text
Dim sURL As String
Dim iPtr1 As Integer, iPtr2 As Integer, iPtr3 As Integer
sURL = strURL.Text
'Host Value
iPtr1 = InStr(sURL, ".")
iPtr3 = InStrRev(sURL, "/", iPtr1 - 1)
If iPtr3 > 0 Then iPtr1 = iPtr3 + 1 Else iPtr1 = 1
iPtr2 = InStr(iPtr1, sURL, "/")
If iPtr2 = 0 Then iPtr2 = Len(sURL) + 1
strHost.Text = Mid(sURL, iPtr1, iPtr2 - iPtr1)
'File Value
iPtr1 = InStrRev(sURL, "/")
If iPtr1 = 0 Then iPtr1 = 1 Else iPtr1 = iPtr1 + 1
iPtr2 = Len(sURL) + 1
strFile.Text = Mid(sURL, iPtr1, iPtr2 - iPtr1)
End Sub
是不是winsock.DataArival以后就会发生winsock_close的?
那这样的话,就不能以一个session值连续访问一个网站的不同页面了?刚才那代码太多废话了,帖个最简单的
Private Sub Command1_Click()
If Winsock1.State = 0 Then Winsock1.Connect Else get_data
End SubPrivate Sub Form_Load()
Winsock1.RemoteHost = "baby.zjjs.net"
End SubPrivate Sub get_data()
Dim sCmd
sCmd = "Get http://baby.zjjs.net/test_http.asp HTTP/1.0" + vbCrLf + vbCrLf
Winsock1.SendData sCmd
End Sub
'断开后 连接上 继续发
If Len(m_strBuff(m_CurBuffIndex)) > 0 Then
Winsock1.SendData m_strBuff(m_CurBuffIndex)
End If
End Sub
网站服务器是IIS 6。0,用ASP VBSCRIPT写的
status_show "ready.."
If socket_thief.State <> 0 Then
'socket_thief.Close
Request_Send (strURL.Text)
Else
init
socket_thief.Connect
End If
End Sub
还是执行那里出错
Dim sCmd
status_show "send request..."
sCmd = "GET " + sURL + " HTTP/1.0" + vbCrLf 'GET ΪFTPÃüÁî
sCmd = sCmd + "Accept: */*" + vbCrLf 'Õâ¾ä¿ÉÒÔ²»Òªs
sCmd = sCmd + "Accept: text/html" + vbCrLf 'Õâ¾ä¿ÉÒÔ²»Òª
sCmd = sCmd + vbCrLf '¼Çסһ¶¨Òª¼ÓÉÏvbCrLf
'+这个判断然后测试,然后告诉我debug的值
If socket_thief.state = 7 Then
socket_thief.SendData sCmd
Else
debug.print socket_thief.state
MsgBox "错误或者未连接"
End If
timer_Begin = Timer()
End Sub
一般web服务器 传输完数据后 为了节省资源都关闭连接的//那这样的话,就不能以一个session值连续访问一个网站的不同页面了?主要你在发送的http头里面加上 cookie:KUYGSDFHSG23983045UEDFGSDFG....(cookie值)
其中cookie值是服务器连接后返回给你的 你只要读取 返回的http头里的cookie值 就可以了
但是这样能保证做到:以一个session值连续访问一个网站的不同页面了
现在我在办公室测试不了,回家再试试,先多谢各位大哥啦 :)但是还有个问题,我连接的网站是我办公室的机,我那个站点是“保持HTTP连接”,为什么还会断开
:(,这个不是主要问题,只是随便问问 :)两位大哥有QQ或者MSN吗?以后还要向两位大哥请教
我的QQ是:17305022,msn:[email protected]
使用了 session 肯定前面会加 cookie 头
加了COOKIE头真的可以保持获得的sessionID不变!!
之前我查看没有COOKIES文件,以为没有COOKIE传下来,真是菜 ^O^多谢 点头大哥!!我继续研究一下,麻烦你到我另外一帖里面随便留个言,加分给你
还有些小疑问想请教你,应该不会很麻烦你的譬如你怎么知道是通过cookie可以保持SESSIONID的,我看了《TCP/IP详解》里面讲到TCP(面向字节的数据流)和HTTP(面向报文)之间的解决方法,但是没有详细讲到怎么实现。
你是在哪里查到的资料,还是通过分析数据包知道的我发现很多东西在GOOGLE挺难找得到真正需要的(可能我不大会查吧),MSDN都是新的东西,要查些这么古老的都不知道哪里找,hehe
但是我没办法发送HTTP/1.0的请求,发送过去就返回400错误,同一个服务器,我的服务器上面已经设置是保持连接,为什么会这样?