我尝试使用套接字在Go和PHP之间进行通信。我正在使用的代码是:
转到:
fmt.Println("Launching server...")
ln, _ := net.Listen("tcp", ":8080")
conn, _ := ln.Accept()
for {
message, _ := bufio.NewReader(conn).ReadString('\n')
fmt.Print("Message Received:", string(message))
conn.Write([]byte("test" +"\n"))
}
PHP:
$address = gethostbyaddr($ip);
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if($socket === false){
echo "socket_create() failed: reason: " . socket_strerror(socket_last_error());
}
$result = socket_connect($socket, $address, $port);
if ($result === false) {
echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket));
}
socket_write($socket, "test", 4);
socket_read($socket, 4);
问题在于Go服务器一直认为它一直在接收内容,所以它不断打印“Message Recieved:”。如果我这样做(消息!=“”)它有点工作,但CPU使用率很高。
另一个问题是服务器没有收到“test”,除非我注释掉socket_read($ socket,4);用PHP。
答案 0 :(得分:1)
ReadString
的{{3}}说:
如果ReadString在找到分隔符之前遇到错误,它会返回错误前读取的数据和错误本身(通常是io.EOF)。
这意味着您将获得io.EOF
(表示没有更多数据可以从连接中读取)和空字符串。
如果您想在没有可用数据的情况下阻止ReadString,请不要使用bufio
,而是直接从连接中读取。
另请参阅:net.Conn
另一个问题是服务器没有收到“test”,除非我注释掉socket_read($ socket,4);用PHP。
这描述了documentation,socket_write
缓冲区:
socket_write()不一定写入给定缓冲区中的所有字节。 [...]
使用
fflush($socket);
写完后。