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()
方法关闭输出流。
我在使用 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()
方法关闭输出流。