2013-03-08 3 views
2

У меня есть простой сервер сокетов, работающий на моем ПК, и я сделал клиенту для ПК, чтобы поговорить с самим собой, но я хотел его адаптировать для Android, но он продолжает сбой, сообщая мне, что-то не так в closeChat(), но я не могу понять, что. Вот мой код:Android-чат между телефоном и ПК

package com.jister13.chattest; 

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

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

public class ChatRoom extends Activity 
{ 
    String ip; 

    EditText userText; 
    EditText chatWindow; 
    Button send; 

    private ObjectOutputStream output; 
    private ObjectInputStream input; 
    private String message = ""; 
    private String serverIP; 
    private Socket connection; 

    private Handler handler; 

    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     Bundle extras = getIntent().getExtras(); 
     if(extras != null) 
     { 
      ip = extras.getString("IP"); 
      serverIP = ip; 
     } 
     setContentView(R.layout.chat_room); 
     setRequestedOrientation(1); 

     handler = new Handler(); 

     userText = (EditText) findViewById(R.id.editText_UserText); 
     chatWindow = (EditText) findViewById(R.id.editText_ChatWindow); 
     chatWindow.addTextChangedListener(new TextWatcher(){ 
      public void afterTextChanged(Editable s) { 
      } 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
      } 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
       Toast.makeText(ChatRoom.this, "Updated", Toast.LENGTH_LONG).show(); 
      } 
     }); 
     send = (Button) findViewById(R.id.button_Send); 
     send.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       sendMessage("You: " + userText.getText().toString() + "\n"); 
       userText.setText(""); 
      } 
     }); 

     startRunning(); 
    } 
    public void startRunning() 
    { 
     try{ 
      connectToServer(); 
      setupStreams(); 
      whileChatting(); 
     }catch(EOFException eofException){ 
      showMessage("\n Chat Session Closed"); 
     }catch(IOException ioException){ 
      ioException.printStackTrace(); 
     }finally{ 
      closeChat(); 
     } 
    } 
    private void connectToServer() throws IOException 
    { 
     showMessage("Starting Connection..."); 
     connection = new Socket(InetAddress.getByName(serverIP), 0511); 
     showMessage("\n Connection Established: "+connection.getInetAddress().getHostName()); 
    } 
    private void setupStreams() throws IOException 
    { 
     output = new ObjectOutputStream(connection.getOutputStream()); 
     output.flush(); 
     input = new ObjectInputStream(connection.getInputStream()); 
     showMessage("\n Chatting streams are now enabled..."); 
    } 
    private void whileChatting() throws IOException 
    { 
     ableToType(true); 
     do{ 
      try{ 
       message = (String) input.readObject(); 
       showMessage("\n "+message); 
      }catch(ClassNotFoundException classNotFoundException){ 
       showMessage("\n Some Error Occured"); 
      } 
     }while(!message.equals("SERVER - END")); 
    } 
    private void closeChat() 
    { 
     showMessage("\n Closing Application..."); 
     ableToType(false); 
     try{ 
      input.close(); 
      output.close(); 
      connection.close(); 
     }catch(IOException e){ 
      e.printStackTrace(); 
     } 
    } 
    private void sendMessage(String text) 
    { 
     try{ 
      output.writeObject("Else: "+text); 
      output.flush(); 
      showMessage("You: "+text+"\n"); 
     }catch(IOException e){ 
      chatWindow.append("\n An Error Occured *See ChatRoom.java -> sendMessage()*"); 
     } 
    } 
    private void showMessage(final String message) 
    { 
     handler.post(new Runnable(){ 
      public void run(){ 
       chatWindow.append(message); 
      } 
     }); 
    } 
    private void ableToType(final boolean TorF) 
    { 
     //userText.setEditable(TorF); 
    } 
} 

http://www.mediafire.com/view/?hr441qalu6b6d7s Это образ того, что ошибка сужается.

Heres вся PrintStackTrace:

03-08 11:02:43.595: E/AndroidRuntime(3959): FATAL EXCEPTION: main 
03-08 11:02:43.595: E/AndroidRuntime(3959): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jister13.chattest/com.jister13.chattest.ChatRoom}: java.lang.NullPointerException 
03-08 11:02:43.595: E/AndroidRuntime(3959):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2088) 
03-08 11:02:43.595: E/AndroidRuntime(3959):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2113) 
03-08 11:02:43.595: E/AndroidRuntime(3959):  at android.app.ActivityThread.access$700(ActivityThread.java:139) 
03-08 11:02:43.595: E/AndroidRuntime(3959):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1224) 
03-08 11:02:43.595: E/AndroidRuntime(3959):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-08 11:02:43.595: E/AndroidRuntime(3959):  at android.os.Looper.loop(Looper.java:137) 
03-08 11:02:43.595: E/AndroidRuntime(3959):  at android.app.ActivityThread.main(ActivityThread.java:4918) 
03-08 11:02:43.595: E/AndroidRuntime(3959):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-08 11:02:43.595: E/AndroidRuntime(3959):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-08 11:02:43.595: E/AndroidRuntime(3959):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004) 
03-08 11:02:43.595: E/AndroidRuntime(3959):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771) 
03-08 11:02:43.595: E/AndroidRuntime(3959):  at dalvik.system.NativeStart.main(Native Method) 
03-08 11:02:43.595: E/AndroidRuntime(3959): Caused by: java.lang.NullPointerException 
03-08 11:02:43.595: E/AndroidRuntime(3959):  at com.jister13.chattest.ChatRoom.closeChat(ChatRoom.java:115) 
03-08 11:02:43.595: E/AndroidRuntime(3959):  at com.jister13.chattest.ChatRoom.startRunning(ChatRoom.java:82) 
03-08 11:02:43.595: E/AndroidRuntime(3959):  at com.jister13.chattest.ChatRoom.onCreate(ChatRoom.java:69) 
03-08 11:02:43.595: E/AndroidRuntime(3959):  at android.app.Activity.performCreate(Activity.java:5048) 
03-08 11:02:43.595: E/AndroidRuntime(3959):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 
03-08 11:02:43.595: E/AndroidRuntime(3959):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2052) 
03-08 11:02:43.595: E/AndroidRuntime(3959):  ... 11 more 
+3

Действительно ли это говорит «что-то не так в методе closeChat()»? – FWeigl

+0

Когда я дважды кликаю по ошибке, он приводит меня к строке, которая говорит closeChat() – Josh

+0

Редактируйте свой вопрос и включите соответствующую часть stacktrace – FoamyGuy

ответ

0

Проще говоря, input равно нулю.

Когда это работает:

public void startRunning() 
{ 
    try{ 
     connectToServer(); 
     setupStreams(); 
     whileChatting(); 
    }catch(EOFException eofException){ 
     showMessage("\n Chat Session Closed"); 
    }catch(IOException ioException){ 
     ioException.printStackTrace(); 
    }finally{ 
     closeChat(); 
    } 
} 

private void connectToServer() throws IOException 
{ 
    showMessage("Starting Connection..."); 
    connection = new Socket(InetAddress.getByName(serverIP), 0511); 
    showMessage("\n Connection Established: "+connection.getInetAddress().getHostName()); 
} 

private void setupStreams() throws IOException 
{ 
    output = new ObjectOutputStream(connection.getOutputStream()); 
    output.flush(); 
    input = new ObjectInputStream(connection.getInputStream()); 
    showMessage("\n Chatting streams are now enabled..."); 
} 

Если вы получите исключение в любом месте, прежде чем input назначается в setupStreams(), он будет нулевым, когда вы finally вызов closeChat(). Так как вы не проверяете нулевое значение, оно перевернется.

Мой совет? Проверяйте вещи перед их использованием:

private void closeChat() 
{ 
    ... 
    if(input != null) 
     input.close(); 
    if(output != null) 
     output.close();  
    if(connection != null) 
     connection.close(); 
    .... 
} 
+0

Я добавил весь журнал ошибок выше – Josh

+0

Так что это определенно NPE на этой линии. Вы пытались выполнить нулевую проверку, как я предложил выше? – Geobits

+0

Исправлено: проблема заключается в том, что потоки никогда не создаются. Я делаю что-то не так, когда дело доходит до метода connectToServer(), потому что теперь он говорит мне, что там есть ошибка. – Josh

Смежные вопросы