Windows客户端与Android服务端的Socket通信

时间:2022-12-21 22:15:06

Windows客户端与Android服务端的Socket通信

Android, Windows, 通信, 客户端, Socket
本帖最后由 simon.zhou 于 2010-6-6 01:38 编辑

这篇原来发在CSDN我的BLOG上,转来这里发下:

最近做的项目中有功能需求要在客户使用PC体验程序时,同时通知与PC通过USB数据线相连的OPhone手机打开相应的网站。故需要编写Windows客户端与Android服务端的Socket通信程序。由于我对OMS系统没有研究,故想直接写Android SDK 1.1的程序应该OMS上也是可以运行的。


1、Android服务端:
  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;
  3. import java.net.ServerSocket;
  4. import java.net.Socket;
  5. import android.app.Activity;
  6. import android.content.Intent;
  7. import android.net.Uri;
  8. import android.os.Bundle;
  9. public class G3Exp extends Activity{
  10.     /** Called when the activity is first created. */
  11.     //定义侦听端口号
  12.     final int SERVER_PORT = 10086;
  13.        
  14.     @Override
  15.     public void onCreate(Bundle savedInstanceState) {
  16.         super.onCreate(savedInstanceState);
  17.         setContentView(R.layout.main);
  18.         
  19.         //开一个新的线程来侦听客户端连接及发来的信息和打开相应网站
  20.         new Thread(){
  21.                    public void run(){
  22.                            startServer();
  23.                    }
  24.                   }.start();
  25.     }
  26.    
  27.     private void startServer()
  28.     {
  29.             try
  30.             {
  31.                     ServerSocket serverSocket = new ServerSocket(SERVER_PORT);
  32.                 //循环侦听客户端连接请求
  33.                 while (true)
  34.                 {
  35.                             Socket client = serverSocket.accept();
  36.                             try
  37.                             {
  38.                                 //等待客户端发送打开网站的消息
  39.                                     BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
  40.                                     String str = in.readLine();
  41.                                     openUrl(str);
  42.                             }
  43.                             catch (Exception e)
  44.                             {
  45.                                     e.printStackTrace();
  46.                             }
  47.                             finally
  48.                             {
  49.                                     client.close();
  50.                             }
  51.                     Thread.sleep(3000);
  52.                 }
  53.             }
  54.             catch (Exception e)
  55.             {
  56.                     e.printStackTrace();
  57.             }
  58.     }
  59.     private void openUrl(String url)
  60.     {
  61.             Uri uri = Uri.parse(url);
  62.             Intent intent = new Intent(Intent.ACTION_VIEW, uri);
  63.             startActivity(intent);
  64.     }
  65. }
复制代码



2、C#客户端:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Net.Sockets;
  5. using System.Diagnostics;
  6. namespace G3Exp.Class
  7. {
  8.     public static class clsAndroid
  9.     {
  10.         static private void Connect(String server, String message)
  11.         {
  12.             try
  13.             {
  14.                 //通过SDK下面的ADB命令来通知Android开侦听10086端口
  15.                 Process p = new Process();
  16.                 p.StartInfo.FileName = AppDomain.CurrentDomain.BaseDirectory+@"/tools/adb.exe";
  17.                 p.StartInfo.Arguments = "forward tcp:12580 tcp:10086";
  18.                 p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
  19.                 p.Start();
  20.                 Int32 port = 12580;
  21.                 TcpClient client = new TcpClient(server, port);
  22.                
  23.                 //把URL发给TCP服务端
  24.                 Byte[] data = System.Text.Encoding.ASCII.GetBytes(message);
  25.                 NetworkStream stream = client.GetStream();
  26.                 stream.Write(data, 0, data.Length);
  27.                 client.Close();
  28.             }
  29.             catch (ArgumentNullException e)
  30.             {
  31.                 Console.WriteLine("ArgumentNullException: {0}", e);
  32.             }
  33.             catch (SocketException e)
  34.             {
  35.                 Console.WriteLine("SocketException: {0}", e);
  36.             }
  37.         }
  38.         public static void OpenWeb(string strUrl)
  39.         {
  40.             Connect("127.0.0.1", strUrl);
  41.         }
  42.     }
  43. }
复制代码



简单说明一下:
(1)在Android中,在打开USB调试的情况下使用USB数据线插入PC后,Android与PC会创建虚拟网络,并且IP为127.0.0.1。但在一些OPhone手机中,使用127.0.0.1确无法连接成功。这时可自行设置IP:
set ADBHOST=192.168.10.1

adb kill-server   
adb start-server
(2)这里使用了一个新的线程来侦听和打开网站的工作,以避免造成主UI线程的阻塞。
(3)由于我对这块功能之前没有做过,故一定会有很多可以改进的地方。