我正在尝试进入物联网,并希望使应用程序将字符串从Android手机发送到Linux PC。该应用程序通过实现asynctask来做到这一点:

//From the java docs, slightly modified
private Void sendThroughSocket(String s, String host, int port) {
    Log.d("E", "In send through  socket");
    final String hostName = host;//Host is the address of the receiver, can be IP or domain
    int portNumber = port;
    //Check if device is connected to internet

    try {
        Socket clientsocket = new Socket(hostName, portNumber); //one of 2-way point communication
        Log.d("E", "Created Socket: ");
        DataOutputStream DOS = new DataOutputStream(clientsocket.getOutputStream());
        if (clientsocket.isConnected())
            Log.d("E", "Socket connected");
        DOS.writeUTF(s);
        clientsocket.close();
    } catch (UnknownHostException e) {
        System.err.println("Don't know about host " + hostName);
        new Runnable() {
            public void run() {
                Toast.makeText(context, "Don't know about host " + hostName, Toast.LENGTH_SHORT).show();
            }
        };

    } catch (IOException e) {
        System.err.println("Couldn't get I/O for the connection to " + hostName);
        //Toast can not be run using asynctask since it acesses UI
        new Runnable() {
            public void run() {
                Toast.makeText(context, "Couldn't get I/O for the connection to " + hostName + " , check the port", Toast.LENGTH_SHORT).show();
            }
        };

    } catch (Exception e) {
        Log.d("E", "#fares" + e.getClass().getName().toString());

    }
    return null;
}

我有3次尝试发送所有从搜索栏触发的字符串(我将搜索栏进度值作为字符串发送):
公共(public)无效onProgressChanged(SeekBar seekBar,int i,boolean b)
公共(public)无效onStartTrackingTouch(SeekBar seekBar)
公共(public)无效onStopTrackingTouch(SeekBar seekBar)

所有这三个的实现是相同的:
公共(public)无效onProgressChanged(SeekBar seekBar,int i,boolean b){
                    progressvalue = i;
                    textView.setText("Brightness = " + progressvalue + " %");


                    if (((RecieverPort.equals("Please enter port Number")) || (RecieverIP.equals("Please enter receiver IP")))) {

                        //Make sure toast isn't persistent
                        if (IPPortToastcount++ == 0)
                            Toast.makeText(MainActivity.this, "Please set both IP and Port ", Toast.LENGTH_SHORT).show();

                    } else {
                        //Check if connected to internet
                        if (!isConnectedtoInternet(MainActivity.this)) {
                            if (ConnectivityToastCount++ < 1)
                                Toast.makeText(MainActivity.this, "You are not connected to the Internet", Toast.LENGTH_SHORT).show();
                        } else {
                            //Send text over wifi
                            SendText ST = new SendText(getApplicationContext());
                            ST.execute(String.valueOf(progressvalue), RecieverIP, RecieverPort);
                            ST.cancel(false);


                        }

                    }


                }

主要是
//Send text over wifi
                            SendText ST = new SendText(getApplicationContext());
                            ST.execute(String.valueOf(progressvalue), RecieverIP, RecieverPort);
                            ST.cancel(false);

服务器端(我的电脑)非常简单:
int portNumber =  44339; // Choose unused port on router
    //Open a socket

    try {

        //System.out.println("in try statement");
        try (ServerSocket serverSocket1 = new ServerSocket(portNumber)) {
            portNumber = serverSocket1.getLocalPort();
           System.out.println("Created socket at port " + portNumber);
            Socket clientSocket = serverSocket1.accept();

            System.out.println("Accepted");

            DataInputStream DIS = new DataInputStream(clientSocket.getInputStream()); //get input from socket
            //System.out.println("Created reader");

            String inputLine;


           // System.out.println("About to read");


            while (DIS.available() > 0) {
                inputLine = DIS.readUTF();
                System.out.println(inputLine);
            }


        }
    } catch (Exception e) {
        System.out.println("Exception caught when trying to listen on port "
                + portNumber + " or listening for a connection");
        System.out.println(e.getClass().getSimpleName());
    }

这种工作方式是不同的,除了在接受服务器套接字之前需要花费很长时间(几秒钟)。它也只能在onprogresschanged下工作,这使我相信多次尝试
//Send text over wifi
                            SendText ST = new SendText(getApplicationContext());
                            ST.execute(String.valueOf(progressvalue), RecieverIP, RecieverPort);
                            ST.cancel(false);

在成功创建套接字并连接到PC之前,需要使用它们。如何确保一键点击或一次调用该函数足以发送字符串?
抱歉,很长的帖子,但这是我第一次问:)

编辑:我的新服务器代码:
try {

        //System.out.println("in try statement");
        try ( ServerSocket serverSocket1 = new ServerSocket(portNumber))
        {
            portNumber = serverSocket1.getLocalPort();
           System.out.println("Created socket at port " + portNumber);
           while(true){
            Socket clientSocket = serverSocket1.accept();

           // System.out.println("Accepted");

            DataInputStream DIS = new DataInputStream(clientSocket.getInputStream()); //get input from socket
            //System.out.println("Created reader");

            //String inputLine;


           //System.out.println("About to read");
           System.out.println(DIS.readUTF());


            }


        }
    } catch (Exception e) {
        System.out.println("Exception caught when trying to listen on port "
                + portNumber + " or listening for a connection");
        System.out.println(e.getClass().getSimpleName());
    }

值得注意的是,即使在while true循环中,服务器也将始终显示4个数字然后停止。

编辑:这是一个示例日志:
10-06 20:08:09.145 26372-26372/com.example.fares.ledslider D/E:#测试方法值中的票价= 50
10-06 20:08:26.475 26372-26372/com.example.fares.ledslider D/E:#开始跟踪票价
10-06 20:08:26.722 26372-27004/com.example.fares.ledslider D/E:#fares已连接套接字
10-06 20:08:26.810 26372-26764/com.example.fares.ledslider D/E:#fares已连接套接字
10-06 20:08:27.241 26372-27003/com.example.fares.ledslider D/E:#fares已连接套接字
10-06 20:08:27.304 26372-26372/com.example.fares.ledslider D/E:#停止跟踪中的票价

最佳答案

可以删除ST.cancel()。也没有等待可用性看起来并不好。

09-07 04:34