同一个应用中的客户端和服务器发送然后接收字节

时间:2017-07-24 19:22:01

标签: java android sockets

我尝试用WiFi替换蓝牙连接。我的原始项目有一个PIC微控制器,它是数据记录时间,日期和临时值,以及控制一些输出。很久以前我写了一个应用程序(3年,从那时起就完成了!),它使用蓝牙从Android向PIC发送和接收数据,工作正常。 到目前为止,我已经将ESP8266连接到Pic微控制器,ESP正在使用ESP-LINK固件并连接到我的家庭网络。 pic将从ESP8266收到的内容中继到RealTerm,以便我可以监控。我创建了一个测试应用程序,它创建一个套接字并向PIC发送一个字节,工作正常,字节正在接收,代码如下。

package com.example.carl.sockets;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class MainActivity extends AppCompatActivity {

    private Socket socket;
    private static final int SERVERPORT = 23;
    private static final String SERVER_IP = "00.00.00.00"; // enter IP of ESP8266 here

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new Thread(new ClientThread()).start();
    }

    public void onClick(View view) {
        try {
            EditText et = (EditText) findViewById(R.id.EditText01);
            Integer i = Integer.parseInt(et.getText().toString());

            DataOutputStream out = new DataOutputStream(socket.getOutputStream());
            if(i > 0 && i < 255){
                out.write(i);
            }else{
                Toast.makeText(this,"Number out of Range !",Toast.LENGTH_SHORT).show();
            }
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    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();
            }
        }
    }
}

一旦将字节发送到PIC,它将发送字节或字节作为响应。我现在需要读取PIC返回的字节或字节,并在TextView中显示它们。我将知道PIC将发送多少字节并由应用程序提前收到。

我看过大量的代码,但似乎都是针对不同的服务器和客户端,我不希望这样(或者我)并且不能想出这个。

之前可能已经提出这个问题,但我已经花了很多时间寻找,并且非常感谢任何帮助或建议。

2 个答案:

答案 0 :(得分:0)

我现在有了这个工作,可以发送一个字节,从我的PIC通过WiFi接收一个字节或字节到我的Android应用程序。 我创建了一个新线程来等待输入流上的数据。我的主要问题是在启动此线程之前确保套接字已连接,一旦我确认它已正常工作。 收到数据后,它会通过处理程序发回主代码。我的处理程序根据收到的内容输出文本到我的应用程序,七个字节是临时读数和时间和日期。只显示单个字节。 我的代码是附加的,可能不是很漂亮!!任何建设性的批评都会受到欢迎。

    def list(self, request):
        #get_queryset is also overridden to accept filters in query_params
        queryset = self.get_queryset()
        if not queryset.exists():
            return Response(status=status.HTTP_204_NO_CONTENT)

        return super(ProductViewSet, self).list(request)

我认为现在唯一的问题是内存泄漏? 我收到了一条消息 - 07-30 17:46:01.154 15417-15445 / com.example.carl.sockets D / dalvikvm:GC_FOR_ALLOC释放512K,22%免费9692K / 12332K,暂停18ms,总计18ms

应用程序启动后,显示器显示我使用的是9.4 MB。

答案 1 :(得分:0)

我对泄漏进行了排序,我正在使用ggplot2来测试数据是否因某种原因存在。真的不明白!摆脱了receiveData中的两个library(tidyverse) library(ggstance) mtcars %>% group_by(cyl, am) %>% summarize(lo = mpg %>% min, hi = mpg %>% max) %>% ggplot() + geom_linerangeh(aes(y = am %>% factor, xmin = lo, xmax = hi, group = am %>% factor), position = position_dodgev(height = .25)) + facet_wrap(~cyl, ncol = 1) 语句,现在效果很好。