2012-09-16 72 views
0

套接字例外,我已经写了客户端和服务器连接在android.When我在模拟器中运行代码,它显示09-16 19:04:14.783:E/ClientActivity(407):java.net。 ConnectException:/10.0.2.15:8080 - 连接被拒绝。我提到许多developer.android重定向。但它没有工作。任何人都可以说出这个异常的原因以及如何解决这个问题? ServerActivity.java如何纠正模拟器

    package com.example.network; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.Inet4Address; 
import java.net.InetAddress; 
import java.net.NetworkInterface; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.net.SocketException; 
import java.util.Enumeration; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 
import android.widget.TextView; 
import android.widget.Toast; 

public class ServerActivity extends Activity { 

    private TextView serverStatus; 

    // default ip 
    public static String SERVERIP = ""; 

    // designate a port 
    public static final int SERVERPORT = 8080; 

    private Handler handler = new Handler(); 

    private ServerSocket serverSocket; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_server); 
     serverStatus = (TextView) findViewById(R.id.textView1); 

     SERVERIP = getLocalIpAddress(); 

     Thread fst = new Thread(new ServerThread()); 
     fst.start(); 
    } 

    public class ServerThread implements Runnable { 

     public void run() { 
      try { 
       if (SERVERIP != null) { 
        handler.post(new Runnable() { 
         @Override 
         public void run() { 
     //     Toast.makeText(getApplicationContext(), i.getHostAddress.toString(),Toast.LENGTH_LONG).show(); 
          serverStatus.setText("Listening on IP: " + SERVERIP); 
         } 
        }); 
        serverSocket = new ServerSocket(SERVERPORT); 
        while (true) { 
         // listen for incoming clients 
         Socket client = serverSocket.accept(); 
         handler.post(new Runnable() { 
          @Override 
          public void run() { 
           serverStatus.setText("Connected."); 
          } 
         }); 

         try { 
          BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
          String line = null; 
          while ((line = in.readLine()) != null) { 
           Log.d("ServerActivity", line); 
           handler.post(new Runnable() { 
            @Override 
            public void run() { 
             // do whatever you want to the front end 
             // this is where you can be creative 
            } 
           }); 
          } 
          break; 
         } catch (Exception e) { 
          handler.post(new Runnable() { 
           @Override 
           public void run() { 
            serverStatus.setText("Oops. Connection interrupted. Please reconnect your phones."); 
           } 
          }); 
          e.printStackTrace(); 
         } 
        } 
       } else { 
        handler.post(new Runnable() { 
         @Override 
         public void run() { 
          serverStatus.setText("Couldn't detect internet connection."); 
         } 
        }); 
       } 
      } catch (Exception e) { 
       handler.post(new Runnable() { 
        @Override 
        public void run() { 
         serverStatus.setText("Error"); 
        } 
       }); 
       e.printStackTrace(); 
      } 
     } 
    } 

    // gets the ip address of your phone's network 
    private String getLocalIpAddress() { 
     try { 
      for (Enumeration<NetworkInterface> en =    NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { 
       NetworkInterface intf = en.nextElement(); 
       for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { 
        InetAddress inetAddress = enumIpAddr.nextElement(); 
        if (!inetAddress.isLoopbackAddress()) { return inetAddress.getHostAddress().toString(); } 
       } 
      } 
     } catch (SocketException ex) { 
      Log.e("ServerActivity", ex.toString()); 
     } 
     return null; 
    } 

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

} 
ClientActivity.java 
     package com.example.network; 

import java.io.BufferedWriter; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.Socket; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 

public class ClientActivity extends Activity { 

    private EditText serverIp; 

    private Button connectPhones; 

    private String serverIpAddress = ""; 

    private boolean connected = false; 

    private Handler handler = new Handler(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_client); 

     serverIp = (EditText) findViewById(R.id.editText1); 
     connectPhones = (Button) findViewById(R.id.button1); 
     connectPhones.setOnClickListener(connectListener); 
    } 

    private OnClickListener connectListener = new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if (!connected) { 
       serverIpAddress = serverIp.getText().toString(); 
       if (!serverIpAddress.equals("")) { 
        Thread cThread = new Thread(new ClientThread()); 
        cThread.start(); 
       } 
      } 
     } 
    }; 

    public class ClientThread implements Runnable { 

     public void run() { 
      try { 
       InetAddress serverAddr = InetAddress.getByName(serverIpAddress); 
       Log.d("ClientActivity", "C: Connecting..."); 
       Socket socket = new Socket(serverAddr, ServerActivity.SERVERPORT); 
       connected = true; 
       while (connected) { 
        try { 
         Log.d("ClientActivity", "C: Sending command."); 
         PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket 
            .getOutputStream())), true); 
          // where you issue the commands 
          out.println("Hey Server!"); 
          Log.d("ClientActivity", "C: Sent."); 
        } catch (Exception e) { 
         Log.e("ClientActivity", "S: Error", e); 
        } 
       } 
       socket.close(); 
       Log.d("ClientActivity", "C: Closed."); 
      } catch (Exception e) { 
       Log.e("ClientActivity", "C: Error", e); 
       connected = false; 
      } 
     } 
    } 
} 

的manifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="org.apache.android.xmpp"> 

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

    <application android:name="XMPPDemosApplication" 
      android:label="XMPP Demo"> 
     <activity android:name=".XMPPClient" android:label="XMPPClient"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 
       <category android:name="android.intent.category.LAUNCHER"/> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 
+0

您可以发布您的清单? – FabianCook

+0

清单文件是用XML不是Java,它应该被称为AndroidManifest.xml中 – FabianCook

+0

我们去那里:)没有拿出尚未 – FabianCook

回答

0

如果您使用的是模拟器我建议你检查你的防火墙设置,确保该模拟器是一个例外

0

另外,如果您正在使用笔记本电脑,并从一个网络移动到另一个网络,则通常需要重新启动模拟器才能在新网络上选择正确的网络设置。

1

您需要添加重定向两个仿真DA之间的工作!
在窗口中,打开命令提示符并键入 - telnet localhost 5554(这个5554是你的接收模拟器运行的端口)
现在你用telnet连接到这个模拟器。现在输入以下命令:redir add tcp:src_port:dst port
src端口指的是机器端口,而dst端口指的是您要重定向到的模拟器端口。这对我来说:)正常工作