0

ソケットライブラリの使用に問題があります。

import java.io.*;
import java.net.*;

public class SocketAdapter{

    Socket mySocket=null;
    PrintWriter out=null;
    BufferedReader in=null;


    public SocketAdapter(String host,int port){


        try {
            InetAddress serverAddr = InetAddress.getByName(host);

            mySocket = new Socket(serverAddr, port);
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            out = new PrintWriter(mySocket.getOutputStream(), true);
        } catch (NullPointerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            in = new BufferedReader(new InputStreamReader(mySocket.getInputStream()));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void writeto(String data){
         out.println(data);
    }

    public String readdata(){

        String fromSocket=null;
        try {
            fromSocket = in.readLine();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }// blocking 
        return fromSocket;

    }
    public void close(){

        try {
            in.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            mySocket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

私はメインアクティビティの2番目のスレッドを介してこのクラスにアクセスします。デバッガーでは、mySocketの値は常にnullです。何が間違っているのかわかりませんが、基本的なことだと確信しています。

編集:インターネットの許可がないアプリによってトリガーされたIOExceptionが原因で、ソケットオブジェクトがnullであることが判明しました。

マニフェストでそれを修正しました。

4

3 に答える 3

0

静的なSocket変数を使用すると、機能する可能性があります。static Socket mySocket = null;

または、別の関数を使用してソケット接続を取得します。

public Socket getSocketConnection(String strServerIP , int iPort) 
{
    try 
    {               
        Socket s = new Socket(strServerIP,iPort);  
        return s;
    }
    catch (Exception e) 
    {           
            return null;
    }
  }// End getSocketConnection Method.     
于 2012-09-12T06:35:47.097 に答える
0

コンストラクターで例外をキャッチすることにはあまり意味がありません。それは、コードの残りの部分を、オブジェクトが完全に構築されていないのに、完全に構築されていると誤解させるだけです。コンストラクターを変更して、これらの例外をスローし、すべてのtry / catchを削除して、呼び出し元のサイトでそれに応じて例外をキャッチします。そうすると、このコードからnullソケット参照を取得することはできなくなります。

于 2012-09-12T07:15:16.397 に答える
-1

複数のスレッドで作業している場合は、請負業者を介して同期する必要があります。自分で実装することも、SocketAdapterクラスインスタンスをvolotileとして定義することもできます。

こちらもお読みください

于 2012-09-12T06:59:44.187 に答える