VB 和 PHP SOCKET 通信问题 请各位帮忙看看

晴天的晴天 2013-10-14 01:03:35


<?php

$server = '127.0.0.1';
$port = 8888;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if($socket < 0) {
echo socket_strerror($socket);
} else {
echo '成功<br />';
}


$result = @socket_connect($socket, $server, $port);

$buf = '你好啊我';
$len = strlen($buf);

socket_send($socket, $buf, $len, 0);

socket_close($socket);

?>




Option Explicit


Private Sub Form_Load()
tcpServer.LocalPort = 8888
tcpServer.Listen
lblstate.Caption = "目前没有客户端连入!"
End Sub

Private Sub tcpServer_ConnectionRequest(ByVal requestID As Long)
If tcpServer.State <> sckClosed Then tcpServer.Close
tcpServer.Accept requestID
lblstate.Caption = "有客户端连入本机! IP:" & tcpServer.RemoteHostIP
End Sub

Private Sub tcpServer_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
tcpServer.GetData strData
txtOutput.Text = strData & vbCrLf & txtOutput.Text
End Sub


Private Sub txtSendData_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
If tcpServer.State = sckConnected Then
tcpServer.SendData "服务器说:" & txtSendData.Text
txtOutput.Text = "服务器说" & txtSendData.Text & vbCrLf & txtOutput.Text
txtSendData.Text = ""
Else
MsgBox "目前没有连接的客户端!"
End If
End If
End Sub







第一次正常 但是 第二次刷新 PHP页面的时候出现 如下错误
Warning: socket_send() [function.socket-send]: unable to write to socket [0]: 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。 in E:\wamp\www\test\test3.php on line 19


有时候VB会出现这样的错误
...全文
380 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
舉杯邀明月 2013-10-14
  • 打赏
  • 举报
回复
引用 6 楼 CityBird 的回复:
虽然加上Winsock1.Listen进行重新监听,但是依然只能接受一个客户端,如果再开个新页面马上就该出错了!
他的设计,看样子只能接受一个连接的。
三楼の郎 2013-10-14
  • 打赏
  • 举报
回复
虽然加上Winsock1.Listen进行重新监听,但是依然只能接受一个客户端,如果再开个新页面马上就该出错了!
舉杯邀明月 2013-10-14
  • 打赏
  • 举报
回复
看来我还是猜对原因了。
晴天的晴天 2013-10-14
  • 打赏
  • 举报
回复
引用 1 楼 CityBird 的回复:
很显然,你这个服务端代码只能支持一个客户端连接一次,所以必然会出现这个结果,建议你还是另找个Winsock多客户端通讯方面的例子看看吧,不是一句两句能解释清楚的。
引用 2 楼 Chen8013 的回复:
我觉得,应该是你的 PHP刷新时,它是把先的连接断开,重新创建连接的。 而你的VB程序那儿,只支持一个连接;   PHP刷新造成连接断开时,你的tcpServer并没有断开(VB端应该是不会接到通知的吧),因此不能接受新的连接请求。
我的问题解决了
在 winsock1.Close 下面加了  重新监听 就行了
 
winsock1.Listen
晴天的晴天 2013-10-14
  • 打赏
  • 举报
回复
引用 2 楼 Chen8013 的回复:
我觉得,应该是你的 PHP刷新时,它是把先的连接断开,重新创建连接的。 而你的VB程序那儿,只支持一个连接;   PHP刷新造成连接断开时,你的tcpServer并没有断开(VB端应该是不会接到通知的吧),因此不能接受新的连接请求。

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
        Label1.Caption = "有客户端接入本机!IP:为" & winsock1.RemoteHostIP

End Sub

Private Sub winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim strData As String
    winsock1.GetData strData
    Text1.Text = strData
    winsock1.Close
End Sub

我已经增加了 close 但是好像还是不行
舉杯邀明月 2013-10-14
  • 打赏
  • 举报
回复
我觉得,应该是你的 PHP刷新时,它是把先的连接断开,重新创建连接的。 而你的VB程序那儿,只支持一个连接;   PHP刷新造成连接断开时,你的tcpServer并没有断开(VB端应该是不会接到通知的吧),因此不能接受新的连接请求。
三楼の郎 2013-10-14
  • 打赏
  • 举报
回复
很显然,你这个服务端代码只能支持一个客户端连接一次,所以必然会出现这个结果,建议你还是另找个Winsock多客户端通讯方面的例子看看吧,不是一句两句能解释清楚的。

1,502

社区成员

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

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