2016-05-25 2 views
1

Я работаю над графическим приложением, пользовательский интерфейс разработан с использованием python (+ kivy), а ядро ​​реализовано с помощью GoLang.Реализация модели Client-Sever с использованием Go и Python в ОС Windows

Мое приложение включает в себя передачу данных из UI в Core, для которых я использую трубы. Ниже приведен фрагмент кода клиента и сервера.

Client.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) 
} 

С выше кусок кода, я не в состоянии установить связь между ними. Мое приложение включает в себя дуплексную связь между клиентом и сервером

Любая помощь приветствуется!

+0

Первое предположение: вы должны «npipe.Dial» на свой именованный канал с go. У вас есть какой-нибудь 'err', который запускает ваш код? – Darigaaz

+0

нет ошибки, «ConnectNamedPipe», похоже, не обнаруживает сервер. Я пробовал один и тот же код с сервером, реализованным в Python, и он отлично работает. – Rjain

+0

afaik 'CreateNamedPipe' создает канал, ожидающий соединений, и' npipe.Listen' создает канал, ожидающий соединений, а также – Darigaaz

ответ

2

i Не удалось найти решение с использованием труб, поэтому я перешел в сокеты, и я могу общаться через сокеты. Ниже приводится фрагменты кодов

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)) 
    } 
} 

выше фрагмент кода работает отлично для моего приложения.