Android手机通过socket与pc通信

原文:http://blog.csdn.net/tobacco5648/article/details/7742295

在Android中可以直接利用java中的Socket与ServerSocket构建socket通信。

    代码的运行环境:

    pc端:普通pc,作为服务器,已经设置有域名(通过动态域名软件设置),在5648端口进行监听。

    Android手机客户端:android2.3设备。


    代码运行一切正常,客户端发送的文字将在服务器端接收并显示,服务器每接收到客户端的一行文字,就会返回一个从0开始递增的整数,此整数将在客户端显示出来。

    pc端代码:

    

[java]  view plain copy
  1. package test;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.io.InputStreamReader;  
  7. import java.io.OutputStream;  
  8. import java.io.PrintWriter;  
  9. import java.net.ServerSocket;  
  10. import java.net.Socket;  
  11.   
  12.   
  13. public class Test implements Runnable{  
  14.   
  15.     /** 
  16.      * @param args 
  17.      */  
  18.       
  19.     int max=10;      //最大开启线程数  
  20.     int i=0;         //回复数字  
  21.     int temp;  
  22.     ServerSocket serverSocket;  
  23.     Socket socket[];  
  24.       
  25.     public Test(){  
  26.           
  27.         try {  
  28.             serverSocket=new ServerSocket(5648);    //在5648端口进行侦听  
  29.         } catch (IOException e) {  
  30.             // TODO Auto-generated catch block  
  31.             e.printStackTrace();  
  32.             System.out.println("can't initate ServerSocket!");  
  33.             return;  
  34.         }  
  35.           
  36.         socket=new Socket[max];  
  37.           
  38.         System.out.println("waiting for connect");  
  39.         try {  
  40.             while((socket[i]=serverSocket.accept())!=null){  
  41.                 temp=i;  
  42.                 i++;  
  43.                 new Thread(this).start();           //每侦听到一个客户端的连接,就会开启一个工作线程  
  44.                   
  45.             }  
  46.         } catch (IOException e) {  
  47.             // TODO Auto-generated catch block  
  48.             e.printStackTrace();  
  49.         }  
  50.     }  
  51.     public static void main(String[] args) {  
  52.         new Test();  
  53.   
  54.     }  
  55.   
  56.     @Override  
  57.     public void run() {  
  58.         Socket sk=socket[temp];  
  59.         System.out.println("accept:"+sk.getInetAddress().getHostAddress());  
  60.         InputStream is=null;  
  61.         OutputStream os=null;  
  62.         BufferedReader br=null;  
  63.         PrintWriter pw=null;  
  64.         try {  
  65.             is=sk.getInputStream();  
  66.             os=sk.getOutputStream();  
  67.             br=new BufferedReader(new InputStreamReader(is));  
  68.             pw=new PrintWriter(os);  
  69.         } catch (IOException e) {  
  70.             // TODO Auto-generated catch block  
  71.             e.printStackTrace();  
  72.             try {  
  73.                 sk.close();  
  74.             } catch (IOException e1) {  
  75.                 // TODO Auto-generated catch block  
  76.                 e1.printStackTrace();  
  77.             }  
  78.             return;  
  79.         }  
  80.         String str;  
  81.         try {  
  82.             int m=0;  
  83.             while((str=br.readLine())!=null){  
  84.                 System.out.println(str);  
  85.                 pw.println(m);  
  86.                 pw.flush();  
  87.                 m++;  
  88.             }  
  89.         } catch (IOException e) {  
  90.             // TODO Auto-generated catch block  
  91.             e.printStackTrace();  
  92.         }  
  93.           
  94.     }  
  95.   
  96. }  


    android设备客户端代码:

    MainActivity.java代码:

    

[java]  view plain copy
  1. package com.tobacco.phonetest;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStreamReader;  
  6. import java.io.PrintWriter;  
  7. import java.net.Socket;  
  8. import java.net.UnknownHostException;  
  9.   
  10. import android.app.Activity;  
  11. import android.os.Bundle;  
  12. import android.os.Handler;  
  13. import android.util.Log;  
  14. import android.view.Menu;  
  15. import android.view.View;  
  16. import android.view.View.OnClickListener;  
  17. import android.widget.Button;  
  18. import android.widget.EditText;  
  19. import android.widget.Toast;  
  20.   
  21. public class MainActivity extends Activity implements OnClickListener,Runnable{  
  22.       
  23.     private Button button;  
  24.     private EditText editText;  
  25.     private Socket socket;  
  26.     private PrintWriter pw;  
  27.     private BufferedReader br;  
  28.     private Handler handler;  
  29.   
  30.     @Override  
  31.     public void onCreate(Bundle savedInstanceState) {  
  32.         super.onCreate(savedInstanceState);  
  33.         setContentView(R.layout.activity_main);  
  34.         handler=new Handler();  
  35.         button=(Button)findViewById(R.id.button);  
  36.         button.setOnClickListener(this);  
  37.         editText=(EditText)findViewById(R.id.edittext);  
  38.         try {  
  39.             socket=new Socket("tobacco5648.xicp.net",5648);        //连接到tobacco5648.xicp.net的5648端口  
[java]  view plain copy
  1. <span style="white-space:pre">                                      </span>//tobacco5648.xicp.net是我申请的域名  
  2.   
  3.         } catch (UnknownHostException e) {  
  4.             // TODO Auto-generated catch block  
  5.             e.printStackTrace();  
  6.             Log.e("socket","unknown host");  
  7.         } catch (IOException e) {  
  8.             // TODO Auto-generated catch block  
  9.             e.printStackTrace();  
  10.             Log.e("socket","io execption");  
  11.         }  
  12.         if(socket==null){  
  13.             Log.e("socket","null");  
  14.         }  
  15.         else  
  16.             try {  
  17.             pw=new PrintWriter(socket.getOutputStream());  
  18.             br=new BufferedReader(new InputStreamReader(socket.getInputStream()));  
  19.             if(pw!=null&&br!=null){  
  20.                 new Thread(this).start();  
  21.             }  
  22.         } catch (IOException e) {  
  23.             // TODO Auto-generated catch block  
  24.             e.printStackTrace();  
  25.         }  
  26.     }  
  27.   
  28.     @Override  
  29.     public boolean onCreateOptionsMenu(Menu menu) {  
  30.         getMenuInflater().inflate(R.menu.activity_main, menu);  
  31.         return true;  
  32.     }  
  33.   
  34.     public void onClick(View view) {  
  35.         if(view==button){  
  36.             String str;  
  37.             str=editText.getText().toString();  
  38.             pw.println(str);  
  39.             pw.flush();  
  40.         }  
  41.           
  42.     }  
  43.   
  44.     public void run() {  
  45.           
  46.         try {  
  47.             String str;  
  48.             while((str=br.readLine())!=null){  
  49.                 final String s=str;  
  50.                 handler.post(new Runnable(){  
  51.   
  52.                     public void run() {  
  53.                         Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();  
  54.                           
  55.                     }});  
  56.                   
  57.             }  
  58.         } catch (IOException e) {  
  59.             // TODO Auto-generated catch block  
  60.             e.printStackTrace();  
  61.         }  
  62.           
  63.     }  
  64.   
  65.       
  66. }  
 

    activity_main.xml代码:

    

[html]  view plain copy
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="match_parent"  
  3.     android:layout_height="match_parent"  
  4.     android:orientation="vertical" >  
  5.   
  6.     <TextView  
  7.         android:layout_width="wrap_content"  
  8.         android:layout_height="wrap_content"  
  9.         android:text="@string/hello_world" />  
  10.       
  11.     <EditText  
  12.         android:id="@+id/edittext"  
  13.         android:layout_width="fill_parent"  
  14.         android:layout_height="wrap_content"  
  15.         android:hint="@string/message" />  
  16.       
  17.     <Button  
  18.         android:id="@+id/button"  
  19.         android:layout_width="fill_parent"  
  20.         android:layout_height="wrap_content"  
  21.         android:text="@string/hello_world" />  
  22.   
  23. </LinearLayout>  

    因为此客户端程序要用到网络,所以要在manifest文件中添加权限。

    Manifest.xml代码:

    

[html]  view plain copy
  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     package="com.tobacco.phonetest"  
  3.     android:versionCode="1"  
  4.     android:versionName="1.0" >  
  5.   
  6.     <uses-sdk  
  7.         android:minSdkVersion="8"  
  8.         android:targetSdkVersion="15" />  
  9.     <uses-permission android:name="android.permission.INTERNET"></uses-permission>  
  10.   
  11.     <application  
  12.         android:icon="@drawable/ic_launcher"  
  13.         android:label="@string/app_name"  
  14.         android:theme="@style/AppTheme" >  
  15.         <activity  
  16.             android:name=".MainActivity"  
  17.             android:label="@string/title_activity_main" >  
  18.             <intent-filter>  
  19.                 <action android:name="android.intent.action.MAIN" />  
  20.   
  21.                 <category android:name="android.intent.category.LAUNCHER" />  
  22.             </intent-filter>  
  23.         </activity>  
  24.     </application>  
  25.   
  26. </manifest>  

你可能感兴趣的:(android,socket)