簡體   English   中英

使用Java / Android中的套接字多次發送二進制數據

[英]Sending binary data multiple times using Sockets in Java/Android

我需要使用Android設備上的Java套接字多次發送二進制數據。 這是一個簡單的對象,可導出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();
            }
        }
    }
}

對於Android編程,我使用Scaloid,這是多次發送二進制數據的代碼。 count由參數給出。 result是Byte [Array]類型的數據,並且gpconCreate()方法中初始化為gpc = new GpcSocket()

gpc.run()
for (i <- 1 to count) {
  val length = gpc.send(result)
  toast(s"Sent: $i $length")
}

問題是,即使我嘗試多次發送數據,接收方也只會收到一個數據包。 這是我發送信息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:

我的問題是

  • 為什么是這樣? 為什么接收器只接收一次? 發件人表明已發送信息五次。
  • 我是否需要在發送多次之前只使用一次run()? 或者,每當我使用send()時都必須調用run()嗎?

這是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()

從這篇文章: 使用Java套接字發送ByteArray(Android編程)以及如何修復java.net.SocketException:管道損壞? ,似乎send()方法是錯誤的。

使用完資源后,請關閉它們

我將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;
}

修改呼叫者代碼

調用它的scala代碼被修改為調用send()方法。

// gpc.run()
for (i <- 1 to count) {
  ...
  val length = gpc.send(result)
  println(s"Sent: $i $length")
}

... in initializer
gpc = new GpcSocket()

在Android中更改政策模式

這篇文章的提示: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM