To jest moje pierwsze pytanie. Szukałem rozwiązań podobnych problemów, ale w każdym przypadku były pewne różnice w porównaniu do mojej sprawy. Próbuję ustanowić proste połączenie między serwerem Python a aplikacją Android przy użyciu gniazd. Aplikacja na Androida rozpoczyna rozmowę z serwerem: wysyła wiadomość na serwer, serwer odbiera i wyświetla ją, a następnie serwer wysyła odpowiedź do aplikacji. Aplikacja wyświetla odpowiedź na ekranie w widoku tekstowym. To jest mój kod po stronie klienta:Połączenie między serwerem Python a aplikacją Android
public class MyClient extends Activity implements OnClickListener{
EditText enterMessage;
Button sendbutton;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.myclient);
enterMessage = (EditText)findViewById(R.id.enterMessage);
sendbutton = (Button)findViewById(R.id.sendbutton);
sendbutton.setOnClickListener(this);
}
@Override
public void onClick(View arg0) {
Thread t = new Thread(){
@Override
public void run() {
try {
Socket s = new Socket("192.168.183.1", 7000);
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
dos.writeUTF(enterMessage.getText().toString());
//read input stream
DataInputStream dis2 = new DataInputStream(s.getInputStream());
InputStreamReader disR2 = new InputStreamReader(dis2);
BufferedReader br = new BufferedReader(disR2);//create a BufferReader object for input
//print the input to the application screen
final TextView receivedMsg = (TextView) findViewById(R.id.textView2);
receivedMsg.setText(br.toString());
dis2.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
};
t.start();
Toast.makeText(this, "The message has been sent", Toast.LENGTH_SHORT).show();
} }
A po stronie serwera to jest mój kod:
from socket import *
HOST = "192.168.183.1" #local host
PORT = 7000 #open port 7000 for connection
s = socket(AF_INET, SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1) #how many connections can it receive at one time
conn, addr = s.accept() #accept the connection
print "Connected by: " , addr #print the address of the person connected
while True:
data = conn.recv(1024) #how many bytes of data will the server receive
print "Received: ", repr(data)
reply = raw_input("Reply: ") #server's reply to the client
conn.sendall(reply)
conn.close()
Gdy próbuję wysłać wiadomość z aplikacji na serwerze działa idealnie . Jednak, gdy tylko serwer odbierze wiadomość i wyświetli ją, aplikacja natychmiast zatrzymuje się z komunikatem o błędzie: niespodziewanie się zatrzymała. Proszę spróbuj ponownie. Dodatkowe informacje: używam pakietu ADT do programowania aplikacji na Androida i IDLE do uruchamiania kodu serwera. Zarówno na Windows8.