2014-04-07 14 views
6

Đây là câu hỏi đầu tiên của tôi. Tôi đã tìm kiếm các giải pháp của các vấn đề tương tự nhưng trong mọi trường hợp có một số khác biệt so với trường hợp của tôi. Tôi đang cố thiết lập kết nối đơn giản giữa máy chủ Python và ứng dụng Android bằng ổ cắm. Ứng dụng Android bắt đầu một cuộc trò chuyện với máy chủ: nó sẽ gửi một tin nhắn đến máy chủ, máy chủ sẽ nhận và hiển thị nó, sau đó máy chủ sẽ gửi trả lời cho ứng dụng. Ứng dụng hiển thị câu trả lời trên màn hình trong một TextView. Đây là mã của tôi trên các mặt hàng:Kết nối giữa Máy chủ Python và Ứng dụng 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(); 
} } 

Và ở phía máy chủ này là mã của tôi:

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() 

Khi tôi cố gắng để gửi một tin nhắn từ ứng dụng đến máy chủ nó hoạt động hoàn hảo . Tuy nhiên, ngay sau khi máy chủ nhận được tin nhắn và hiển thị nó, ứng dụng sẽ dừng ngay lập tức với thông báo lỗi: đã dừng đột ngột. Vui lòng thử lại. Thông tin bổ sung: Tôi đang sử dụng gói quảng cáo để phát triển Android và IDLE để chạy mã máy chủ. Cả hai trên Windows8.

Trả lời

2

Từ những gì tôi hiểu bạn sử dụng một sợi để gọi máy chủ nhưng trong cùng một thread bạn cố gắng đăng lại kết quả cho giao diện người dùng.

TextView cuối cùng đã nhậnMsg = (TextView) findViewById (R.id.textView2); receivedMsg.setText (br.toString());

Nếu bạn sử dụng chuỗi Java của riêng mình, bạn phải xử lý các yêu cầu sau trong mã của riêng mình: Đồng bộ hóa với chuỗi chính nếu bạn đăng lại kết quả vào giao diện người dùng. Tôi không thấy rằng bạn đang làm điều này. Bạn phải sử dụng Trình xử lý hoặc có thể bạn nên cân nhắc sử dụng Asynctask của Android. Với AsyncTAsk bạn có thể viết trong giao diện người dùng sau khi phương thức này được kích hoạt. onPostExecute (Kết quả) Được viện dẫn trên chuỗi giao diện người dùng sau khi tính toán nền kết thúc.

Vì vậy, bên trong phương pháp này bạn có thể viết trong giao diện người dùng. có xem các liên kết này http://learningdot.diandian.com/post/2014-01-02/40060635109 Asynctask vs Thread in android

0

Bạn đang viết thư cho đối tượng GUI trong chuỗi không phải là gui. Bạn cần sử dụng một trình xử lý để truyền thông điệp trở lại luồng GUI.

Nhìn vào đây để một ví dụ khá đơn giản: Update UI through Handler

Các vấn đề liên quan