【问题标题】:golang Server with Java Client带有 Java 客户端的 golang 服务器
【发布时间】:2016-05-11 07:56:01
【问题描述】:

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

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

【问题讨论】:

  • 根据所附图片,您正在发送两个单独的字符串,Go 您正在按预期接收这些字符串(两个单独的字符串)。
  • Conn.Read() 在找到换行符之前不会读取,它可以读取介于0 和传递的切片长度之间的任意字节数(参见io.Reader)。您可以使用bufio.Scanner 阅读整行。
  • 但我将消息作为一个字符串发送。这是我在 Java 端调用 sendDataToServer 的代码 System.out.println("Geben sie eine Nachricht ein:");字符串消息 = in.next(); dataController.sendDataToServer(socket, message);收到的字符串 = dataController.recieveDataFromServer(socket); System.out.println("服务器:"+收到);我也尝试使用 bufio.Scanner,但我的解决方案没有奏效。同样的问题。

标签: java sockets go server client


【解决方案1】:

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

ReadFull in 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 变得复杂,并在 java 中读取 int 和 readFull 字节...

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

Code to send and write bytes in Go

Code to send and write bytes in Java

希望对你有所帮助...

【讨论】:

    【解决方案2】:

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

    这里是gitrepo

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

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

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

    在构建方面可能有点贵,但它会使您的项目可重用,并且您肯定会学到新的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-17
      • 2018-01-01
      • 2017-06-19
      • 1970-01-01
      相关资源
      最近更新 更多