我有一个大问题.... 我们有一个关于学校和工作的项目。 我写了go服务器和我的伙伴java客户端。 我有一个问题,如果他发送的内容如下:" Hello World" golang服务器将其拆分为" Hello"和"世界"
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写入套接字时,它更容易,也更正确。
答案 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来定义服务合约。
因此,您可以将此服务用于其他客户端,也可以使用任何语言。
为了实现这一点,您只需要提取服务合同并以客户端语言生成合同。
在建造方面可能会有点贵,但它会让你的项目可以重复使用,而且你肯定会学到新东西。