#android #python-2.7 #client-server
#Android #python-2.7 #клиент-сервер
Вопрос:
Я хочу обеспечить простую связь между сервером Python, работающим на ПК, и клиентом Android. Я протестировал его с помощью клиентской программы Python, и он работал хорошо, но в Android он не работает.Вот мой код на стороне сервера Python:
import socket
import sys
HOST = '192.168.1.102'
PORT = 8888
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'socket created'
#Bind socket to Host and Port
try:
s.bind((HOST, PORT))
except socket.error as err:
print 'Bind Failed, Error Code: ' str(err[0]) ', Message: ' err[1]
sys.exit()
print 'Socket Bind Success!'
#listen(): This method sets up and start TCP listener.
s.listen(10)
print 'Socket is now listening'
while 1:
conn, addr = s.accept()
print 'Connect with ' addr[0] ':' str(addr[1])
buf = conn.recv(64)
print buf
s.close()
Это мой MainActivity.java код :
package com.example.tjsiledar.sendmessage;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText editText = (EditText) findViewById(R.id.editText);
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new SendMessage().execute(editText.getText().toString());
editText.getText().clear();
}
});
}
}
и это мой SendMessage.java код :
package com.example.tjsiledar.sendmessage;
import android.os.AsyncTask;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
public class SendMessage extends AsyncTask<String, Void, Void> {
private Exception exception;
@Override
protected Void doInBackground(String... params) {
try {
try {
Socket socket = new Socket("192.168.1.102",8888);
PrintWriter outToServer = new PrintWriter(
new OutputStreamWriter(
socket.getOutputStream()));
outToServer.print(params[0]);
outToServer.flush();
} catch (IOException e) {
e.printStackTrace();
}
} catch (Exception e) {
this.exception = e;
return null;
}
return null;
}
}
Комментарии:
1. «он не работает» — это расплывчато. Что происходит? Есть ошибки? Печатает ли сервер что-нибудь. Вам должно быть легко выяснить, зависает ли он где-нибудь или какие ошибки происходят.
2. Ничего не происходит. Ошибок нет. Я не получаю никаких сообщений на стороне сервера на моем ПК
3. Таким образом, вы никогда не достигаете,
print 'Socket Bind Success!'
что означает, чтоsocket.socket()
это должно висеть …. но это крайне маловероятно. Был ли ваш сервер серьезно скомпрометирован?4. Нет, я имел в виду, что когда я набираю сообщение на Android и отправляю его нажатием кнопки, я не получаю его на стороне сервера python. Серверная часть Python работает идеально. На стороне сервера он доходит до «Сокет теперь прослушивает» и ожидает. На стороне Android он также выполняет эту строку
editText.getText().clear();
, но на стороне сервера по-прежнему ничего не получено.5. Я не эксперт по Java и не смогу найти ошибки, специфичные для Java. Но было бы интересно иметь трассировки в
protected Void doInBackground(String... params) {
, особенно в общем обработчике исключений ` catch (Исключение e)`. Код что-то делает, и выяснение этого чего-то будет указывать на проблему.