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

时间:2016-11-02 18:53:53

标签: java android go tcpsocket

我遇到了Java socket和golang的一些问题。我正在尝试开发一个golang服务器,它发送/接收字节数组到android客户端。现在android客户端可以发送字节数组到服务器,但无法从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();
           }
        });
         }

这是go代码。如果我删除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")
}

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

1 个答案:

答案 0 :(得分:0)

Go端的

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

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