golang 服务器发送字节数组到 Android

golang server sending byte array to Android

我在使用 Java 套接字和 golang 时遇到了一些问题。我正在尝试开发一个 sends/receives 字节数组到 android 客户端的 golang 服务器。现在 android 客户端可以将字节数组发送到 go 服务器,但无法从 go 服务器接收任何内容。我附上了下面的代码。

到达in.read()时代码卡住了;我尝试 in.available() 查看输入流中有多少字节。它总是显示 0:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button regButton = (Button) findViewById(R.id.regbut);
    msg = (TextView) findViewById(R.id.msg);

    regButton.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View view){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    byte[] array;
                    BigInteger mykey = mykey(publicKey);
                    System.out.println(mykey);
                    BigInteger rawkey = generater.modPow(mykey,publicKey);
                    BigInteger serverRawKey;
                    System.out.println(rawkey);
                    array = rawkey.toByteArray();
                    System.out.println(rawkey.bitCount());
                    try{
                        Socket con = new Socket("149.166.134.55",9999);
                        OutputStream out = con.getOutputStream();
                        InputStream in = con.getInputStream();
                        DataOutputStream dOut = new DataOutputStream(out);
                        //DataInputStream din = new DataInputStream(in);
                        byte[] data = new byte[10];
                        dOut.write(array);
                        TimeUnit.SECONDS.sleep(10);
                        System.out.println(in.available());
                        in.read(data);
                        con.close();
                        }catch (Exception e){
                        System.out.println(e);
                       }
                   }
               }).start();
           }
        });
         }

这是执行代码。如果我删除 in.read();在 java 中一切正常。但是当我添加 in.read();

时它会暂停
var publickey *big.Int

func ClientListen(port string) {
    ln, err := net.Listen("tcp", port)
    if err != nil {
        fmt.Println("error\n")
        fmt.Println(err)
        return
    }
    for {
        nc, err := ln.Accept()
        if err != nil {
            fmt.Println(err)
            continue
        }
        go recivemsg(nc)
    }
}

func recivemsg(nc net.Conn) {
    publickey = big.NewInt(15485863)
    var msg []byte
    var buf bytes.Buffer
    rawkey := big.NewInt(0)
    io.Copy(&buf, nc)
    fmt.Println("total size:", buf.Len())
    msg = buf.Bytes()
    rawkey = rawkey.SetBytes(msg)
    fmt.Println(msg, "    ", rawkey)
    r := rand.New(rand.NewSource(99))
    myraw := big.NewInt(0)
    myraw = myraw.Rand(r, publickey)
    fmt.Println(myraw)
    newmsg := myraw.Bytes()
    nc.Write(newmsg)
    nc.Close()
    fmt.Println(nc.RemoteAddr())

}

func main() {
    ClientListen(":9999")
}

感谢大家花时间阅读我的问题

io.Copy(&buf, nc) 在 Go 端将继续从连接的输入流中读取,直到它关闭。在 Java 端,您尝试从连接的输入流中读取,但 Go 端仍在等待进一步的输入,因为 Java 仍在保持其输出流(Go 的输入流)打开。

解决方案:在 Java 端,在完成写入后使用套接字的 shutdownOutput() 方法关闭输出流。