在 android 应用程序中调用 java 客户端

Calling a java client in an android application

我有一个客户端可以通过 TCP 向服务器发送一些信息:

    public class IR {

    private String host; //server IP address indicated here, I deleted it for posting here
    private int port = 6789;

    private String sentence;
    private String reply;

    public IR(String type) {
        try {

            Socket clientSocket = new Socket(host,port); //IP du server ("localhost" pour un server local) et port utilisé

            DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
            BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));


                Gson gson = new GsonBuilder().create();
                FileReader file = new FileReader("data/userInfo.json");
                String json = "";
                int i = 0;
                while ((i = file.read()) != -1)
                    json += (char)i;
                User user = gson.fromJson(json, User.class);
                String user_id = user.getID();
                int bus_id = user.getBusID();

                sentence = "alerte " + type + " " + user_id + " " + bus_id;
                System.out.println("SENTENCE: " + sentence);
                outToServer.writeBytes(sentence + '\n');
                reply = inFromServer.readLine();
                System.out.println("ANSWER: " + reply);

            clientSocket.close();

        }
        catch (Exception io) {
            System.out.println("Connection refusée: arrêt");
        }
    }
}

我在我的 android 应用程序中调用它:我有一个按钮,当我点击它时使用这个方法:

public void signalerComplet(View view)
{
    client = new IR("complet");
    Toast.makeText(this, "envoyé", Toast.LENGTH_SHORT).show();
}

但是我的服务器没有得到任何东西。 不过,我确信我的客户端在我不在我的 android 应用程序中使用时可以正常工作。 有人可以告诉我我在这里缺少什么吗?

编辑 在得到 Hector 的帮助后:服务器得到我的 "bloubloubloub" 但我在 "int size = in.read(data);" 上得到 android.os.NetworkOnMainThreadException ...

private Socket socket;

  public void signalerComplet(View view)
{
    PrintWriter out = null;
    InputStream in=null;

    byte[] data = new byte[5120];

    try {
        out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
    }
    catch (IOException e) {
        e.printStackTrace();
    }

    out.println("bloubloubloub" + '\n');
    out.flush();

    try {
        in = socket.getInputStream();
        int size = in.read(data);
    }
    catch (IOException e) {
        e.printStackTrace();
    }

    Log.e("data from server", data.toString());
}

当你这样做时:

 client = new IR("complet");

您将遇到 IR 构造函数中的 else 语句,该语句尽管关闭了连接但什么也不做。

type.equals(null) 将始终是 false 就好像变量 type 实际上拥有一个 null 值一样它将抛出一个 NullPointerException 因为没有方法equals 代表 null 值。因此 if 主体永远不会执行。

如果变量是 null,则正确的匹配方法是 == 运算符。

if (type == null) {
  // do this
} else {
  // do that
}

equals() 上的 String 应该用于与另一个 String 进行比较。

在 Android 中,您不能将所有这些代码都放在 onCreate 方法(例如)和 运行 中,因为您无法启动阻塞的进程主线程,在这种情况下 Socket clientSocket = new Socket(host,port); 将阻塞主线程,您的应用程序将崩溃。您需要使用线程进行此 tcp 通信。请尝试此代码并遵循此算法:

创建这个内部 class,这将使用线程执行套接字连接:

class ClientThread implements Runnable {
        @Override
        public void run() {
            try {
                socket = new Socket(ipServer, portServer);
            } catch (UnknownHostException e1) {
                threadMsg("Connection fails");
            } catch (IOException e1) {
                threadMsg("Connection fails");
            }
        }
    }

onCreate方法中调用这个

new Thread(new ClientThread()).start();

在你的发送按钮中应该放这样的东西:

PrintWriter out = null;
try {
     out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
} catch (IOException e) {
     e.printStackTrace();
}
out.println(messageToServer);
out.flush();

这应该将字符串发送到服务器套接字。您还需要添加一些基本验证。

编辑: 要从服务器获取数据,请在新的 onClick 按钮方法中添加此代码:

byte[] data = new byte[5120];
try {
   in = socket.getInputStream();
   int size = in.read(data);
   // see the received data from server in you LogCat
   Log.e("data from server", data.toString());
} catch (Exception e) {
   e.printStackTrace();
}

希望对您有所帮助。

这是我所做的。再次感谢 Hector 的帮助。效果很好。任何可能 "magnified" 的内容都将不胜感激。 :)

public class SignalerProblemeActivity extends Activity {


public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.signaler_probleme);
}

public void signalerComplet(View view)
{
    new Thread(new CompletThread()).start();
    Toast.makeText(this, "Signalement de bus complet envoyé", Toast.LENGTH_SHORT).show();
}

class CompletThread implements Runnable {
    @Override
    public void run() {
        Socket socket=null;
        User u = new User("momo",12);
        String sentence="alerte complet "+u.getID()+u.getBusID();

        try {
            //CREATION SOCKET
            socket=new Socket("123.456.789.10",6789);

            //SENDING
            PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
            out.println(sentence);

            //GETTING
            BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String mstr=br.readLine();

            Log.e("CLIENT",mstr);

        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }catch(Exception e)
        {
            Log.e("CLIENT",e.toString());
        }

    }
}

}