golang Server with Java Client

时间:2016-05-11 07:56:01

标签: java sockets go server client

我有一个大问题.... 我们有一个关于学校和工作的项目。 我写了go服务器和我的伙伴java客户端。 我有一个问题,如果他发送的内容如下:" Hello World" golang服务器将其拆分为" Hello"和"世界"

See Picture

Java代码:

public class DataController {
public String recieveDataFromServer(Socket socket) throws Exception {

    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    while (!bufferedReader.ready()) { }
    String data = bufferedReader.readLine();
    return data;
}

public void sendDataToServer(Socket socket, String data) throws Exception
{
    PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
    printWriter.println(data);
}
}

转码:

func handleRequest(conn net.Conn) {
request := make([]byte, 256)

for {
    _, err := conn.Read(request)
    if err != nil {
        Error.Println(err.Error())
        return
    }               
    Info.Println("Message Received: " + string(request))
    message := []byte(time.Now().String())
    message = append(message, []byte(": ")...)
    message = append(message, request...)
    broadcast(message)
}
}

广播功能只为所有连接执行conn.Write(msg)。

有谁知道问题是什么?

编辑:我发现了问题。 Java在每个单词之后添加\ r \ n。然后go服务器认为消息结束了。我们现在切换到c#。使用bufferedWriter写入套接字时,它更容易,也更正确。

2 个答案:

答案 0 :(得分:0)

您可能需要首先发送要读取的字节数,然后再发送要使用io.ReadFull函数读取的字节...这样您就可以确保读取所有字符串...

go https://golang.org/pkg/io/https://golang.org/pkg/io/

中的ReadFull

使用DataInputStream的ReadFully Java:https://docs.oracle.com/javase/8/docs/api/

  • 首先用字节数读取int ....

  • 稍后使用io.ReadFull方法读取字节...

注意:您需要将bigendianess中的整数写入java。

mosquitto_sub -h  host -p 8883 -t topic -i client id

我的建议是使用go中的复合体并在java中读取int和readFull字节...

注意:如果您需要发送图像或某些类似的内容,您只能在两个方向上简单地写入字节...

Code to send and write bytes in Go

Code to send and write bytes in Java

我希望这有帮助...

答案 1 :(得分:0)

在这种情况下,我建议使用gRPC。这是documentation

这里是gitrepo

使用protobuf代替JSON来定义服务合约。

因此,您可以将此服务用于其他客户端,也可以使用任何语言。

为了实现这一点,您只需要提取服务合同并以客户端语言生成合同。

在建造方面可能会有点贵,但它会让你的项目可以重复使用,而且你肯定会学到新东西。