猿问

带有 Java 客户端的 golang 服务器

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

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 server 认为消息结束了。我们现在切换到 c#。在使用 bufferedWriter 写入套接字时,它更容易并且工作正确。


qq_花开花谢_0
浏览 174回答 2
2回答

米琪卡哇伊

在这种情况下,我会建议使用 gRPC。这是文档这是gitrepo。使用protobuf而不是 JSON 来定义服务合同。因此,您也可以将此服务用于其他可能使用任何语言的客户。为了实现这一点,您只需要提取您的服务合同并以客户各自的语言生成您的合同。在构建方面可能有点贵,但它会让你的项目可重用,而且你肯定会学到一些新东西。

杨__羊羊

您可能需要先发送要读取的字节数,然后再发送要使用 io.ReadFull 函数读取的字节...这样您就可以确定读取了所有字符串...在 go https://golang.org/pkg/io/https://golang.org/pkg/io/ 中阅读全文ReadFully Java 与 DataInputStream :https://docs.oracle.com/javase/8/docs/api/首先读取 int 的字节数....稍后使用 io.ReadFull 方法读取字节...注意:您需要将 bigendianess 中的整数写入 java。binary.Write(tx, binary.BigEndian, value)我的建议是让复杂的 go 和 read int 和 readFull 字节在 java 中......注意:如果您需要发送图像或类似的东西,您只能在两个方向上简单地写入字节......在 Go 中发送和写入字节的代码在 Java 中发送和写入字节的代码我希望这有帮助...
随时随地看视频慕课网APP

相关分类

Go
我要回答