在 Windows 操作系统上使用 Go 和 Python 实现客户端-服务器模型
Posted
技术标签:
【中文标题】在 Windows 操作系统上使用 Go 和 Python 实现客户端-服务器模型【英文标题】:Implementing Client- Sever model using Go and Python on Windows OS 【发布时间】:2016-05-25 16:07:59 【问题描述】:我正在开发一个 GUI 应用程序,UI 是使用 python(+kivy) 开发的,核心是使用 GoLang 实现的。
我的应用程序涉及将数据从 UI 传递到 Core,为此我使用管道。以下是 Client 和 Server 代码的 sn-p。
客户端.py:
p = win32pipe.CreateNamedPipe(r'\\.\pipe\test_pipe',
win32pipe.PIPE_ACCESS_DUPLEX,
win32pipe.PIPE_TYPE_MESSAGE |win32pipe.PIPE_WAIT,
1, 65536, 65536,300,None)
win32pipe.ConnectNamedPipe(p, None)
data = "Hello Pipe"
win32file.WriteFile(p, bytes(data,"UTF-8"))
Server.go:
ln, err := npipe.Listen(`\\.\pipe\test_pipe`)
if err != nil
// handle error
for
conn, err := ln.Accept()
if err != nil
// handle error
continue
// handle connection like any other net.Conn
go func(conn net.Conn)
r := bufio.NewReader(conn)
msg, err := r.ReadString('\n')
if err != nil
// handle error
return
fmt.Println(msg)
(conn)
使用上面的代码,我无法在它们之间建立连接。我的应用程序涉及客户端和服务器之间的双工通信
感谢任何形式的帮助!
【问题讨论】:
第一个猜测:你必须npipe.Dial
从 go 到你的命名管道。您是否有任何 err
正在运行您的代码?
没有错误,“ConnectNamedPipe”似乎没有检测到服务器。我用 Python 实现的服务器尝试了相同的代码,它工作正常。
afaik CreateNamedPipe
创建管道等待连接,npipe.Listen
也创建管道等待连接
我正在尝试建立单向通信,然后再使其成为双工。所以,我的 sn-p 确实包含您需要的代码。
【参考方案1】:
我找不到使用管道的解决方案,所以我转移到套接字,我能够通过套接字进行通信。以下是sn-ps的代码
Client.py
import socket
import struct
# create a socket object
requestCore = socket.socket(
socket.AF_INET, socket.SOCK_STREAM)
responseCore = socket.socket(
socket.AF_INET, socket.SOCK_STREAM)
# get local machine name
host = socket.gethostname()
port = 8100
# bind to the port
requestCore.bind((host, port))
# queue up to 5 requests
requestCore.listen(5)
client,addr = requestCore.accept()
port = 9999
responseCore.connect((host, port))
while True:
msg = input("User Input: ")
client.send(bytes(msg.encode('UTF-8')))
msgFrmServ = responseCore.recv(64)
print("message from Server",msgFrmServ)
client.close()
responseCore.close()
server.go
package main
import "net"
import "fmt"
import "bufio"
import "os"
import "bytes"
func main()
hostname,_ := os.Hostname()
// connect to this socket
readconn, _ := net.Dial("tcp", hostname+":8100")
reader := bufio.NewReader(readconn)
ln, _ := net.Listen("tcp", hostname+":9999")
writeconn, _ := ln.Accept() // accept connection on port
for
text := make([]byte,64)
reader.Read(text)
text = bytes.Trim(text,"\x00")
fmt.Println(string(text))
Acktext := "Core Acknowledge: " + string(text)
writeconn.Write([]byte(Acktext))
上面的 sn-p 适用于我的应用程序。
【讨论】:
以上是关于在 Windows 操作系统上使用 Go 和 Python 实现客户端-服务器模型的主要内容,如果未能解决你的问题,请参考以下文章