繁体   English   中英

Android上的客户端套接字

[英]Client socket on android

我正在尝试将一个字符串从android发送到pc,并在对该网站和其他网站进行了一些研究之后,我发现了有关套接字以及如何使用它们的信息。 我已经编写了可以接收发送给它的字符串的服务器程序。 下面是代码。

//static ServerSocket variable
    private static ServerSocket server;
    //socket server port on which it will listen
    private static int port = 9021;

    public static void main(String [] args) throws IOException, ClassNotFoundException{

        server = new ServerSocket(port);


        while(true){
            System.out.println("Waiting for client request." + InetAddress.getLocalHost());

            Socket socket = server.accept();

            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());

            String message = (String)ois.readObject();
            System.out.println("Message received: " + message);

            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());

            oos.writeObject("Hi Client: " + message);

            ois.close();
            oos.close();
            socket.close();


            if(message.equalsIgnoreCase("exit")){
                break;
            }
        }
        System.out.println("Shutting down serve");

        server.close();
    }

我已经使用发送字符串的pc客户端程序对此进行了测试,并确认此服务器脚本有效。 我现在尝试在android中实现相同的概念,但面临很多麻烦,这主要是因为在线完成此任务的教程已经非常过时(2-3年),因此没有任何预期的效果。 谁能告诉我如何编写一个非常简单的android应用,其中通过套接字发送单个字符串?

根据我在logcat中看到的信息,互联网上过时的教程无法正常工作,因为android在最近的版本中显然引入了一个非常激进的进程管理器,该进程管理器监视线程的行为,如果有重复的线程动作,它将关闭它不知不觉中。

编辑:根据解决方案,我已经实现了asynctask。 但是现在服务器未接收到并显示地址已在使用中。 我认为这是因为我的android代码中的套接字地址。 请帮忙!

public class MainActivity extends Activity {


    private Button button;
     private EditText message;
     private TextView finalResult;


     //InetAddress host;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        message = (EditText) findViewById(R.id.et_time);
        button = (Button) findViewById(R.id.btn_do_it);
        finalResult = (TextView) findViewById(R.id.tv_result);

        /*
        try {
            host = InetAddress.getLocalHost();
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }*/

        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                AsyncTaskRunner runner = new AsyncTaskRunner();
                String msg = message.getText().toString();
                runner.execute(msg);

            }
        });

    }



    private class AsyncTaskRunner extends AsyncTask<String, String, String> {


        Socket socket = null;
        ObjectOutputStream oos = null;
        ObjectInputStream ois = null;
        int clientport = 8080;
        String resp;

        @Override
        protected String doInBackground(String... params) {
            publishProgress("Sending...");

            String msg = params[0];


            for(int i=0;i<=5;i++){

                //establish socket connection to server
                try {
                    socket = new Socket( "100.69.73.16",clientport);
                    //write to socket using Objectouputstream
                    oos = new ObjectOutputStream(socket.getOutputStream());
                    oos.writeObject(msg+i);


                    oos.close();
                    socket.close();
                    Thread.sleep(100);
                } catch (UnknownHostException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


            }



            resp = "Message has been sent";
            return resp;

        }

        @Override
        protected void onPostExecute(String result) {


            finalResult.setText(result);
        }

        @Override
        protected void onPreExecute() {


        }

        @Override
        protected void onProgressUpdate(String... values) {

             finalResult.setText(values[0]);
        }

    }


}

好的,所以我通过更改端口号解决了“地址已使用”的问题。 显然,笔记本电脑上的其他程序正在使用该端口号。 因此,回想一下任何人检查如何执行此操作,您可以使用我上面的代码,并记住将两个代码中的端口号更改为类似的名称。 同样在打开套接字的我的android代码中,您可以为计算机输入本地ip地址(非常重要,谷歌为您提供外部地址)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM