您的位置:首页 > 移动开发 > Android开发

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

2011-04-18 16:39 543 查看
下文转自 http://blog.csdn.net/sinom/archive/2010/06/04/5646369.aspx
然后c#代码 加了个主函数。我的调试环境是pc端是win7 vs2008,服务端 android版本是2.2

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

1、Android服务端:

import android.app.Activity;
import android.os.Bundle;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
public class G3Exp extends Activity {
/** Called when the activity is first created. */
//定义侦听端口号
final int SERVER_PORT = 10086;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

//开一个新的线程来侦听客户端连接及发来的信息和打开相应网站
new Thread(){
public void run(){
startServer();
}
}.start();
}

private void startServer()
{
try
{
ServerSocket serverSocket = new ServerSocket(SERVER_PORT);
//循环侦听客户端连接请求
while (true)
{
Socket client = serverSocket.accept();
try
{
//等待客户端发送打开网站的消息
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
String str = in.readLine();
openUrl(str);
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
client.close();
}
Thread.sleep(3000);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
private void openUrl(String url)
{
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}
}


2、C#客户端:

using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Diagnostics;
namespace clsAndroid
{
class Program
{
static void Main(string[] args)
{
OpenWeb("http://www.baidu.com");
}
static private void Connect(String server, String message)
{
try
{
//通过SDK下面的ADB命令来通知Android开侦听10086端口
Process p = new Process();
p.StartInfo.FileName = AppDomain.CurrentDomain.BaseDirectory + @"/tools/adb.exe";
p.StartInfo.Arguments = "forward tcp:12580 tcp:10086";
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.Start();
Int32 port = 12580;
TcpClient client = new TcpClient(server, port);
//把URL发给TCP服务端
Byte[] data = System.Text.Encoding.ASCII.GetBytes(message);
NetworkStream stream = client.GetStream();
stream.Write(data, 0, data.Length);
client.Close();
}
catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException: {0}", e);
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
}
public static void OpenWeb(string strUrl)
{
Connect("127.0.0.1", strUrl);
}
}
}


简单说明一下:

(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)由于我对这块功能之前没有做过,故一定会有很多可以改进的地方。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: