Android和Linux服务器之间的TCP连接

问题描述:

我正在编写一个代码,需要每秒从Android移动设备向台式计算机(linux服务器)发送数据。由于数据经常发送,通过Http命中无法实现(因为会消耗时间),所以Tcp通信似乎是更好的选择,因为android手机的数据可以通过此套接字编程快速发送。 客户端的Android手机上的代码是:Android和Linux服务器之间的TCP连接

import java.io.IOException; 
import java.io.OutputStream; 
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.Socket; 
import java.net.UnknownHostException; 

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


public class GetWebPage extends Activity { 

    //Handler h; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     final EditText eText = (EditText) findViewById(R.id.address); 
     final TextView tView = (TextView) findViewById(R.id.pagetext); 

     final Button button = (Button) findViewById(R.id.ButtonGo); 
     button.setOnClickListener(new Button.OnClickListener() { 
      public void onClick(View v) { 
       try { 
         Log.v("Tcp","Clicked the button"); 
          InetAddress serveraddress=InetAddress.getByName("67.23.14.156"); 
          Log.v("Tcp", "Got the InetAddress"); 
         Socket s = new Socket(serveraddress,4447); 
         Log.v("Tcp","Got the Socket address"); 
         OutputStream out = s.getOutputStream(); 
         PrintWriter output = new PrintWriter(out); 
         output.println("Hello Android!"); 
         out.close(); 

       } catch (UnknownHostException e) { 
        tView.setText(e.toString()); 
        Log.v("Tcp",e.toString()); 
       } catch (IOException e) { 
        tView.setText(e.toString()); 
        Log.v("Tcp",e.toString()); 
       }catch (Exception e) { 
        tView.setText(e.toString()); 

       } 
      } 
     });   
    } 
} 

服务器端代码:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class ListenIncomingTcpConnection { 

    public static void main(String[] args) { 
     ServerSocket serverSocket=null; 
     Socket client=null; 
     try { 
      System.out.println("Creating the server object..."); 
      serverSocket = new ServerSocket(4447); 
      System.out.println("Waiting for the connection..."); 
     } catch (IOException e1) { 
      System.out.println(e1); 

     } 

     while (true) { 

      try { 
       client = serverSocket.accept(); 
       System.out.println("Reading the content..."); 
      } catch (IOException e1) { 
       System.out.println(e1); 
       e1.printStackTrace(); 
      } 
      try { 
       BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
       String str = in.readLine(); 
       System.out.println("Reading the content....."); 
      } catch(Exception e) { 
       System.out.println(e); 
      } finally { 
       try{ 
        client.close(); 
       }catch(Exception e){ 
        System.out.println(e); 
       } 
      } 
     }//while 
    }//PSVM 

} 

清单文件的代码是:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.spce" android:versionCode="1" android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="4" /> 


    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name="GetWebPage"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

    </application> 
<uses-permission android:name="android.permission.INTERNET"></uses-permission> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> 
</manifest> 

我已经执行了服务器端的代码在linux机器上通过putty上的“java”命令。它在此行执行并停止“client = serverSocket.accept();” 当我执行的Android手机客户端,它说:

单击该按钮 得到InetAddress是否 java.net.SocketException异常:没有到主机的路由

我不能够发现的这种情况的原因没有路由到主机。

请帮忙解决问题。

貌似你在一个IP地址做DNS查找

serveraddress=InetAddress.getByName("67.23.14.156")

尝试直接使用的IP地址。

new Socket("67.23.14.156",4447);