получение питона из сокета - PullRequest
0 голосов
/ 27 июля 2010

Итак, у меня есть простой сервер сокетов на эмуляторе Android. Когда я только отправляю данные на него, он работает просто отлично. Но потом, если я захочу вернуть эти данные обратно в скрипт на python, это вообще не сработает. Вот код, который работает:

Android:



try {
                serverSocket = new ServerSocket(port);
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }


            while (checkingForClients) {

                try {
                    clientSocket = serverSocket.accept();

                    out = new PrintWriter(clientSocket.getOutputStream(), true);
                    in = new BufferedReader(new InputStreamReader(
                            clientSocket.getInputStream()));

                    line = null;
                    while ((line = in.readLine()) != null) {
                        Log.d("ServerActivity", line);

                        /* THIS IS THE LINE THAT DOESN'T WORK*/
                        //out.println(line);
                        handler.post(new Runnable() {
                            @Override
                            public void run() {

                                if(incomingData == null){
                                    Log.e("Socket Thingey", "Null Error");
                                }
                                //out.println(line);

                                incomingData.setText("Testing");

                                incomingData.setText(line);


                            }
                        });

                    }

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


питон



import socket 

host = 'localhost' 
port = 5000
size = 1024 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((host,port)) 
s.send('Hello, World!') 
# data = s.recv(size) THIS LINE CAUSES PROBLEMS
s.close() 
print 'Received:' , data


Итак, есть 2 прокомментированные строки. Без этих линий все работает отлично. Но если я добавлю s.recv(size) в python, он просто зависнет, и я предполагаю, что ждет полученных данных. Но проблема в том, что код Android никогда не получает отправленные данные. Поэтому я понятия не имею, что делать.

Имейте в виду, что я новичок в python и в сокетах.

Ответы [ 3 ]

4 голосов
/ 27 июля 2010

Чтобы убедиться, что все ваши данные действительно отправляются без необходимости закрывать сокет, не используйте метод send вашего сокета - используйте его sendall метод вместо!Посмотрите на документы для sendall ...:

В отличие от send (), этот метод продолжает отправлять данные из строки до тех пор, пока все данные не будут отправлены или пока не возникнет ошибкапроисходит.

, в то время как для send, чуть выше на той же странице, скажем

Возвращает количество отправленных байтов.Приложения отвечают за проверку того, что все данные были отправлены;если были переданы только некоторые данные, приложение должно попытаться доставить оставшиеся данные.

1 голос
/ 24 ноября 2011

У меня была некоторая проблема, вы пропустили socket.shutdown () в вашем коде:

s.send('Hello, World!')
s.shutdown(1)
data = s.recv(size)
s.close() 
print 'Received:' , data

Вы узнаете что-то новое ... Dennis

0 голосов
/ 24 ноября 2011

Код Android читает строки, поэтому вам, вероятно, нужно отправить \ n или, возможно, \ r \ n в конце строки отправки Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...