无法在android上使用socket编程接收多个数据

2024-06-26 00:14:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我是新的socket编程,基本上想通过socket编程将多个数据从服务器(带python的PC)发送到我的android应用程序。问题是:

1)服务器确认abt 10+连接并停止接收客户端请求。在

2)客户端服务器挂起,不打印单个数据。在

试图同步异步任务,但似乎表面上不起作用,它应该如何。在

如果有任何建议能让它发挥作用,我们将不胜感激。在

ANDROID客户端

package com.example.clientserver;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.concurrent.Semaphore;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

TextView textResponse;
EditText editTextAddress, editTextPort;
Button buttonConnect, buttonClear;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    editTextAddress = (EditText) findViewById(R.id.address);
    editTextPort = (EditText) findViewById(R.id.port);
    buttonConnect = (Button) findViewById(R.id.connect);
    buttonClear = (Button) findViewById(R.id.clear);
    textResponse = (TextView) findViewById(R.id.response);

    buttonConnect.setOnClickListener(buttonConnectOnClickListener);

    buttonClear.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            textResponse.setText("");
        }
    });
}

OnClickListener buttonConnectOnClickListener = new OnClickListener() {

    @Override
    public void onClick(View arg0) {
        /*
         * MyClientTask myClientTask = new MyClientTask(
         * editTextAddress.getText().toString(),
         * Integer.parseInt(editTextPort.getText().toString()));
         * myClientTask.execute();
         */
        RealTimeTask realTimeTask = new RealTimeTask(editTextAddress
                .getText().toString(), Integer.parseInt(editTextPort
                .getText().toString()));
        realTimeTask.start();

    }
};

public class RealTimeTask {
    String dstAddress;
    int dstPort;
    String response = "";

    RealTimeTask(String addr, int port) {
        dstAddress = addr;
        dstPort = port;
    }

    public void start() {
        int loop = 0;
        Semaphore semaphore = new Semaphore(1);
        while (true) {
            try {
                Thread.sleep((long) 0.1);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            try {
                semaphore.acquire();
            } catch (InterruptedException e) {
                System.out.println("got interrupted!");
            }

            MyClientTask myClientTask = new MyClientTask(dstAddress,
                    dstPort);
            myClientTask.execute();
            semaphore.release();

            loop++;

        }
    }
}

public class MyClientTask extends AsyncTask<Void, Void, Void> {

    String dstAddress;
    int dstPort;
    String response = "";

    MyClientTask(String addr, int port) {
        dstAddress = addr;
        dstPort = port;

    }

    @Override
    protected Void doInBackground(Void... arg0) {

        Socket socket = null;

        try {
            socket = new Socket(dstAddress, dstPort);

            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(
                    1024);
            byte[] buffer = new byte[1024];

            int bytesRead;
            InputStream inputStream = socket.getInputStream();

            /*
             * notice: inputStream.read() will block if no data return
             */
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                byteArrayOutputStream.write(buffer, 0, bytesRead);
                response += byteArrayOutputStream.toString("UTF-8");
            }

        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            response = "UnknownHostException: " + e.toString();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            response = "IOException: " + e.toString();
        } finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        textResponse.setText(response);
        super.onPostExecute(result);

    }

}

}

PYTHON服务器


^{pr2}$

Tags: importnewstringresponsesocketjavapublicandroid