2012-10-23 23 views
1

我正在將從theneboston.com學到的客戶端服務器應用程序轉換爲Android應用程序,它是一個使用套接字(TCP連接)進行通信的即時消息應用程序,在我的Android應用程序中,一個設備是服務器,另一個是客戶端。現在有在模擬器上運行的服務器端應用程序時出了問題,該應用程序凍結約40秒鐘,然後一個錯誤消息彈出說:我在這裏做錯了什麼:Android Socket Connection?

活動ServerIM(在應用程序的Android Server即時消息) 不迴應

我認爲問題在於創建ServerSocket。我真的需要這個,所以我很感激它,任何人都可以幫助我。

這是我ServeIM的Android類別:

package com.example.android.server.instant.messenger; 

import java.io.EOFException; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.net.ServerSocket; 
import java.net.Socket; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.Menu; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ScrollView; 
import android.widget.TextView; 
import android.view.View.OnClickListener; 

public class ServerIM extends Activity { 

    private ScrollView scrollView; 
    private EditText userText; 
    private Button connectButton; 
    private Button sendButton; 
    private TextView chatLog; 

    private ObjectOutputStream output; 
    private ObjectInputStream input; 
    private ServerSocket server; 
    private Socket connection; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_server_im); 

     scrollView = (ScrollView) findViewById(R.id.ScrollView); 
     userText = (EditText) findViewById(R.id.user_Text); 
     connectButton = (Button) findViewById(R.id.button_connect); 
     sendButton = (Button) findViewById(R.id.button_send); 
     chatLog = (TextView) findViewById(R.id.chat_Log); 

     ableToType(false); 

     connectButton.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       showMessage("1"); // this message doesn't appends to the 
            // TextView 
       startRunning(); 
      } 
     }); 

    } 

    public void startRunning() { 
     try { 
      (new Thread(new Runnable() { 
       public void run() { 
        try { 
         server = new ServerSocket(5678, 100); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      })).start(); 
      while (true) { 
       try { 
        waitForConnection(); 
        setupStreams(); 
        whileChatting(); 
       } catch (EOFException eofException) { 
        showMessage("\n Server ended the connection!"); 
       } finally { 
        closeCrap(); 
       } 
      } 
     } catch (IOException ioException) { 
      ioException.printStackTrace(); 
     } 

    } 

    // wait for connection, then display connection information 
    private void waitForConnection() throws IOException { 
     showMessage("Waiting for someone to connect... \n"); 
     connection = server.accept(); 
     showMessage("Now connected to " 
       + connection.getInetAddress().getHostName()); 
    } 

    // get stream to send and recieve data 
    private void setupStreams() throws IOException { 
     output = new ObjectOutputStream(connection.getOutputStream()); 
     output.flush(); 
     input = new ObjectInputStream(connection.getInputStream()); 
     showMessage("\n Streams are now setup! \n"); 
    } 

    // during the chat conversation 
    private void whileChatting() throws IOException { 
     String message = " You are now connected! "; 
     sendMessage(message); 
     ableToType(true); 
     do { 
      // have a conversation 
      try { 
       message = (String) input.readObject(); 
       showMessage("\n" + message); 
      } catch (ClassNotFoundException classNotFoundException) { 
       showMessage("\n idk wtf that user sent! "); 
      } 
     } while (!message.equals("CLIENT - END")); 
    } 

    // close streams ans sockets after you are done chatting 
    private void closeCrap() { 
     showMessage("\n Closing Connections... \n"); 
     ableToType(false); 
     try { 
      output.close(); 
      input.close(); 
      connection.close(); 
     } catch (IOException ioException) { 
      ioException.printStackTrace(); 
     } 
    } 

    // send message to client 
    private void sendMessage(String message) { 
     try { 
      output.writeObject("SERVER - " + message); 
      output.flush(); 
      showMessage("\n Server - " + message); 
     } catch (IOException ioException) { 
      chatLog.append("\n ERROR: I can't send this message"); 
     } 
    } 

    // update chatWindow 
    private void showMessage(final String text) { 
     final Handler myHandler = new Handler(); 

     (new Thread(new Runnable() { 
      public void run() { 
       myHandler.post(new Runnable() { 
        public void run() { 
         chatLog.append(text + "\n"); 
        } 
       }); 
      } 
     })).start(); 
    } 

    // let the user type stuff into their box 
    private void ableToType(final boolean tof) { 

     final Handler myHandler = new Handler(); 

     (new Thread(new Runnable() { 
      public void run() { 
       myHandler.post(new Runnable() { 
        public void run() { 
         userText.setEnabled(tof); 
        } 
       }); 
      } 
     })).start(); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_server_im, menu); 
     return true; 
    } 
} 

這是XML文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <ScrollView 
     android:id="@+id/ScrollView" 
     android:layout_width="fill_parent" 
     android:layout_height="150dp" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" > 

     <TextView 
      android:id="@+id/chat_Log" 
      android:layout_width="wrap_content" 
      android:layout_height="339dp" 
      android:text="" /> 
    </ScrollView> 

    <EditText 
     android:inputType="text" 
     android:id="@+id/user_Text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/ScrollView" 
     android:layout_marginTop="39dp" 
     android:ems="10" /> 

    <Button 
     android:id="@+id/button_send" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/user_Text" 
     android:layout_toRightOf="@+id/user_Text" 
     android:minWidth="100dip" 
     android:text="Send" /> 

    <Button 
     android:id="@+id/button_connect" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignLeft="@+id/button_send" 
     android:layout_alignRight="@+id/button_send" 
     android:layout_below="@+id/button_send" 
     android:text="Connect" /> 

</RelativeLayout> 

且相應的清單:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.android.server.instant.messenger" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-permission android:name="android.permission.INTERNET" /> 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="15" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".ServerIM" 
      android:label="@string/title_activity_server_im" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 
+0

請嘗試查找問題的最小示例 – johannes

回答

1

ServerSocket.accept()功能在運行UI線程,並將阻塞,直到它獲得連接。

你有正確的想法,在不同的線程中創建ServerSocket,但你必須在後臺運行accept()函數。

0

在事件處理程序(ServerIM.java:68)中有while (true),這會使EDT掛起。

相關問題