2012-10-16 51 views
0

我有問題,Android的插座,我有兩個Android應用ServerServerClient,在ServerClient它給nullPointerException在下面寫安卓插座nullPointerExeption

InetAddress serverAddr = InetAddress.getByName(serverIpAddress); 
socket = new Socket(serverAddr, REDIRECTED_SERVERPORT); 

我檢查serverAddr是10.0.2.2第二行,後來我看到該套接字爲空。任何人都可以幫忙嗎?

編輯:與此serverAddress我看到它無法訪問,也許我必須使它可達手動? 這裏是源

*ServerClient* 

package com.example.serverclient; 

import android.os.Bundle; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.Socket; 
import java.net.UnknownHostException; 

import android.app.Activity; 
import android.util.Log; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.view.View; 
import android.view.Menu; 

public class MainActivity extends Activity { 

    private Button bt; 
    private TextView tv; 
    private Socket socket; 
    private String serverIpAddress = "10.0.2.2"; 
    private static final int REDIRECTED_SERVERPORT = 5000; 

    // AND THAT'S MY DEV'T MACHINE WHERE PACKETS TO 
    // PORT 5000 GET REDIRECTED TO THE SERVER EMULATOR'S 
    // PORT 6000 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     bt = (Button) findViewById(R.id.myButton); 
     tv = (TextView) findViewById(R.id.myTextView); 
     try { 
      InetAddress serverAddr = InetAddress.getByName(serverIpAddress); 
      socket = new Socket(serverAddr, REDIRECTED_SERVERPORT); 
     } catch (UnknownHostException e1) { 
      e1.printStackTrace(); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
     bt.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
      try { 
       EditText et = (EditText) findViewById(R.id.EditText01); 
       String str = et.getText().toString(); 
       OutputStream sk = socket.getOutputStream(); 

       PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true); 
       out.println(str); 
       Log.d("Client", "Client sent message"); 
      } catch (UnknownHostException e) { 
       tv.setText("Error1"); 
       e.printStackTrace(); 
      } catch (IOException e) { 
       tv.setText("Error2"); 
       e.printStackTrace(); 
      } catch (Exception e) { 
       tv.setText("Error3"); 
       e.printStackTrace(); 
      } 
      } 
     }); 
    } 
} 


**Server** 
package com.example.myserver; 

import android.os.Bundle; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 
import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.widget.TextView; 
import android.app.Activity; 
import android.view.Menu; 

public class MainActivity extends Activity { 

    ServerSocket ss = null; 
     String mClientMsg = ""; 
     Thread myCommsThread = null; 
     protected static final int MSG_ID = 0x1337; 
     public static final int SERVERPORT = 6000; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     TextView tv = (TextView) findViewById(R.id.TextView01); 
     tv.setText("Nothing from client yet"); 
     this.myCommsThread = new Thread(new CommsThread()); 
     this.myCommsThread.start(); 
     } 

     @Override 
     protected void onStop() { 
     super.onStop(); 
     try { 
      // make sure you close the socket upon exiting 
      ss.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     } 

     Handler myUpdateHandler = new Handler() { 
     public void handleMessage(Message msg) { 
      switch (msg.what) { 
      case MSG_ID: 
       TextView tv = (TextView) findViewById(R.id.TextView01); 
       tv.setText(mClientMsg); 
       break; 
      default: 
       break; 
      } 
      super.handleMessage(msg); 
     } 
     }; 
     class CommsThread implements Runnable { 
     public void run() { 
      Socket s = null; 
      try { 
       ss = new ServerSocket(SERVERPORT); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      while (!Thread.currentThread().isInterrupted()) { 
       Message m = new Message(); 
       m.what = MSG_ID; 
       try { 
        if (s == null) 
         s = ss.accept(); 
        BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream())); 
        String st = null; 
        st = input.readLine(); 
        mClientMsg = st; 
        myUpdateHandler.sendMessage(m); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
     } 
} 

回答

1

你是否確信你沒有得到一個UnknownHostExceptionIOException?其中一個必須被呼叫,否則socket不會爲空。

+0

感謝響應,沒有你看到我用了3個漁獲,任何人應自己打印的文本,當我按下按鈕它印有「誤差3」這意味着非的UnknownHostException非IOException異常 –

+0

我說關於第一次嘗試catch語句。當您創建活動時,您會看到輸出,而不是當您按下按鈕時。您需要查看控制檯正在顯示的內容,即e.printStackTrace()將寫入的位置。 –

+0

我試過Samsung Tab,並且在這一行上找不到源錯誤 socket = new Socket(serverAddr,REDIRECTED_SERVERPORT); –

0

將NullPointerException的錯誤3段的(異常e)更改爲NullPointerException,然後運行客戶端併發送消息。錯誤3將不再顯示在屏幕上,您將在Myserver上收到消息。

例外五 - > NullPointerException異常

0

此類返回你的反應,還需要互聯網的權限清單文件。

public class ChatApplication extends Application { 

    private Socket mSocket; 
    { 
     try { 
      mSocket = IO.socket("http://chat.socket.io"); 
     } catch (URISyntaxException e) { 
      throw new RuntimeException(e); 
     } 
    } 

    public Socket getSocket() { 
     return mSocket; 
    } 
}