[英]Sending binary data multiple times using Sockets in Java/Android
I need to send binary data multiple times with Java Sockets on Android devices. 我需要使用Android设备上的Java套接字多次发送二进制数据。 This is a simple object that exports run() and send() methods. 这是一个简单的对象,可导出run()和send()方法。
public class GpcSocket {
private Socket socket;
private static final int SERVERPORT = 9999;
private static final String SERVER_IP = "10.0.1.4";
public void run() {
new Thread(new ClientThread()).start();
}
public int send(byte[] str) {
try {
final BufferedOutputStream outStream = new BufferedOutputStream(socket.getOutputStream());
outStream.write(str);
outStream.flush();
outStream.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return str.length;
}
class ClientThread implements Runnable {
@Override
public void run() {
try {
InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
socket = new Socket(serverAddr, SERVERPORT);
} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
For Android Programming, I use Scaloid, and this is the code to send the binary data multiple times. 对于Android编程,我使用Scaloid,这是多次发送二进制数据的代码。 count
is given from a parameter. count
由参数给出。 result
is Byte[Array] type data, and gpc
is initialized in onCreate()
method as gpc = new GpcSocket()
. result
是Byte [Array]类型的数据,并且gpc
在onCreate()
方法中初始化为gpc = new GpcSocket()
。
gpc.run()
for (i <- 1 to count) {
val length = gpc.send(result)
toast(s"Sent: $i $length")
}
The issue is that even when I try to send data multiple times, the receiver receives only one packet. 问题是,即使我尝试多次发送数据,接收方也只会收到一个数据包。 This is what is shown in the server (receiver) side when I send the information 5 times: 这是我发送信息5次时在服务器(接收方)端显示的内容:
55:2015-03-21 03:46:51 86: <RECEIVED DATA>
10.0.1.27 wrote:
56:2015-03-21 03:46:51 0:
10.0.1.27 wrote:
57:2015-03-21 03:46:51 0:
10.0.1.27 wrote:
58:2015-03-21 03:46:51 0:
10.0.1.27 wrote:
59:2015-03-21 03:46:51 0:
My questions are 我的问题是
This is the server side code in Python: 这是Python中的服务器端代码:
import SocketServer
from time import gmtime, strftime
count = 1
class MyTCPHandler(SocketServer.BaseRequestHandler):
"""
The RequestHandler class for our server.
It is instantiated once per connection to the server, and must
override the handle() method to implement communication to the
client.
"""
def handle(self):
# self.request is the TCP socket connected to the client
self.data = self.request.recv(1024).strip()
print "{} wrote:".format(self.client_address[0])
global count
count += 1
print "%d:%s %d:%s" % (count, strftime("%Y-%m-%d %H:%M:%S", gmtime()), len(self.data), self.data)
# just send back the same data, but upper-cased
self.request.sendall(self.data.upper())
if __name__ == "__main__":
HOST, PORT = "10.0.1.4", 9999
# Create the server, binding to localhost on port 9999
server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
# Activate the server; this will keep running until you
# interrupt the program with Ctrl-C
server.serve_forever()
From this post: Sending ByteArray using Java Sockets (Android programming) and How to fix java.net.SocketException: Broken pipe? 从这篇文章: 使用Java套接字发送ByteArray(Android编程)以及如何修复java.net.SocketException:管道损坏? , it seems like that the send() method is wrong. ,似乎send()方法是错误的。
I modified the send() to be simple that create the socket and close it when I'm done using it. 我将send()修改为创建套接字并在使用完毕后将其关闭的简单方法。
public int send(byte[] str) throws IOException {
InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
socket = new Socket(serverAddr, SERVERPORT);
out = socket.getOutputStream();
out.write(str);
out.flush();
out.close();
socket.close();
return str.length;
}
The scala code that calls it is modified to invoke the send() method. 调用它的scala代码被修改为调用send()方法。
// gpc.run()
for (i <- 1 to count) {
...
val length = gpc.send(result)
println(s"Sent: $i $length")
}
... in initializer
gpc = new GpcSocket()
Hints from this post: android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145) , this code should be added for Android device to prevent E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: scaloid.example, PID: 1791 android.os.NetworkOnMainThreadException
error. 这篇文章的提示: android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)上的android.os.NetworkOnMainThreadException ,应为Android设备添加此代码,以防止E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: scaloid.example, PID: 1791 android.os.NetworkOnMainThreadException
错误。
val policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.