【问题标题】:How can socket Server catch data from client just in the moment when client send it?套接字服务器如何在客户端发送数据的那一刻从客户端捕获数据?
【发布时间】:2014-09-09 10:29:52
【问题描述】:

该程序包括我必须通过 Android 应用程序向 Wifi 接入点发送一个字节,然后这个字节由硬件设备解释。

我可以向客户端发送字节并且它正确接收字节(还有更多字节,不知道为什么,可能是因为协议)。硬件过滤协议字节并仅捕获正确的字节。

这就是我发送它的方式(之前用另一种方法创建的字节,但它是正确的):

public static void sendByte (Byte data) throws IOException { 

    DataOutputStream output; 
    Socket client; 
    client = new Socket("1.2.3.4", 2000); 
    output = new DataOutputStream(client.getOutputStream());
    output.write(data); 
    output.close(); 
    client.close(); 
    Log.w("INFO","Data sended");

}

当我发送字节时,硬件部分改变了灯的颜色,并且成功发生了。

我也写了这 3 行:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

直到这里没有问题。

然后我也想从那个硬件字节接收。想象一下有人改变了那盏灯的颜色,我想知道。于是我创建了一个接收方法:

public static String readByte() throws IOException{
    InputStream input;
    DataInputStream iData;
    String data = null;
    try {

        byte[] bytes = {0, 0, 0, 0, 0, 0, 0, 0};
        Socket server = new Socket(2000);
        Socket client = server.accept();
        input = client.getInputStream();
        iData = new DataInputStream(input);
        Scanner scanner = new Scanner(iData);
        iData.skip(0);
        iData.read(bytes, 0, 8);
        data = bytesToHex(bytes); //A simple method that change bytes to hex, this method it's correct
        Log.w("READ", "" + data);
        input.close();
        client.close();
        server.close();

    }catch(IOException e){
        Log.w("EROR","No es pot conectar");

    }
    return data;

}

这里我创建了一个连接客户端获取数据的服务器(我不知道是否有必要创建一个服务器)。问题是我总是收到 7 个字节,而且它们总是相同的,我使用 skip(7) 跳过协议字节,但后来我不再收到字节了。

我知道硬件通过我连接的 wifi 发送字节,但我无法捕捉到它们。

_________TO SUM UP_________

我认为问题在于我无法捕获字节,因为硬件部分只是发送给我,而我的 Android 应用程序无法存储它。我想在硬件发送给我时读取字节,或者类似的东西。我到处搜索方法和对象属性,但找不到解决方案:(

感谢您的关注。 想知道 ServerSocket 是否是绝对必要的。

【问题讨论】:

  • 您确定应该使用同一个 2000 端口进行双向通信吗?往返 wifi 接入点?
  • 理想情况下,您的应用程序应该在某个端口上启动一个 ServerSocket。每当灯光颜色发生变化时,硬件应该联系您的 ServerSocket。但是,我认为您没有能力告诉 wifi 接入点将数据发送到某个服务器套接字。
  • 想知道 ServerSocket 是否是绝对必要的。 你需要一个在 Android 设备中的 ServerSocket,如果它应该接受来自硬件的连接。你必须使用TCP吗?对我来说,这听起来像使用 UDP 更好......
  • 您可以在同一连接上接收。但你必须坚持下去。这意味着您将不得不使用单独的线程来读取(在同一个 Socket 实例上)或使用 nio。
  • 关键是,您无法知道硬件何时发送数据。所以你必须有一个线程(和一个 loop 在它里面)不断检查传入的数据。您可以跨线程共享同一个套接字实例以发送到硬件。

标签: java android client byte send


【解决方案1】:

当java程序向硬件发送数据时,此时java程序是客户端,硬件是服务器。

当硬件向java程序发送数据时,硬件是客户端,你的java程序是服务器。

因此,在您的 java 程序中,您需要有两个线程,一个客户端线程(使用 Socket 发送字节)和一个服务器线程(使用 ServerSocket,例如,在端口 8999 上)接收字节。

对于向您发送字节的硬件,它需要以下详细信息。 1. 运行您的 java 程序的设备的 IP 地址或主机名。 2. ServerSocket 监听的端口(本例中为 8999)。

如果您的硬件手册说它可以向您发送数据,那么我相信您可以在某处配置这些详细信息。 (我不确定您的硬件是什么。所以,请查看您的硬件手册了解如何配置这些详细信息)。

有时,设备可以在您打开的同一个 Socket 上发送响应。 (同样,我不知道它是如何在您的硬件中完成的。请参阅您的硬件手册)。在这种情况下,请保持您的套接字打开并在单独的线程中读取它。

【讨论】:

  • 必须是严格的线程?我想做几次,如果是线程,我会启动很多次,可行吗?你知道我在哪里可以找到你在说什么的示例代码吗?我是 Threads 的菜鸟 :( 抱歉。
  • 不,您不会启动多个线程。只要连接正常,您将拥有一个“主”线程和一个 Reader 线程,它们将在循环中检查传入数据(读取)。
  • 但是我一直在接收相同的字节:2A 48 45 4C 4C 4F 2A 如果我把输入放在一个无限的 bucle 中,它一直读取相同,即使光线发生变化并且硬件向我发送一个字节。
  • @Llangostu 我觉得你应该连接到一些不同的端口。请检查您是否连接到正确的端口号以从接入点获取事件?
  • 等一下...端口 2000 是 Cisco Skinny 呼叫控制协议...您的配置是否会干扰路由器上的某些功能?尝试过其他端口吗?
猜你喜欢
  • 1970-01-01
  • 2011-09-18
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-19
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
相关资源
最近更新 更多