当前位置:编程学习 > wap >>

安卓程序与VC的socket通信

手机通过usb接入电脑,
apk监听1234端口
adb forward tcp:1234 tcp:1234
然后本地一个vc程序创建套接字链接本地1234端口与apk进行通信,

PrintWriter out = new PrintWriter(s.getOutputStream(), true);
String strAll = getAllText();
out.println("Server:" + strAll);

我这样是apk是可以给vc客户端发数据的,但是vc通过send给apk那边发数据,apk那边怎么也接收不到,
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream())); 
String vcContext = in.readLine();
这样接收不到
din = socket.getInputStream();
din.read(buffer)
也接受不到
卧槽。。

到底怎么才能收到呢。。没搞过安卓
求教
--------------------编程问答-------------------- 接分的也没有?!! --------------------编程问答-------------------- PC端的windows防火墙端口打开了吗? --------------------编程问答-------------------- 在Android端用工具试试服务端1234端口能ping通吗? --------------------编程问答-------------------- 可以看看是否有以下几个问题
系统防火墙问题
adb forward tcp:1234 tcp 1234是否成功执行(可以使用telnet localhost 1234检查)

代码上,apk应该先listen 1234端口,循环accept接收请求
然后vc在PC上connect
如果connect可以成功,说明连上了

你可以在apk那边log一下accept的结果,看是否成功收到新客户端
在accept成功之后,会有新socket建立,利用这个新socket发送字节流,PC自然能收得到

你先按这个做一下吧,有什么问题再具体说
原先我做过一个安卓PC助手,有点小经验 --------------------编程问答-------------------- 我次奥too.我也在弄这个,手机端获取了APK信息和图标想发到PC上。Socket两天都没成功,我是PC做客户端,手机做服务器端。intenet权限也加了,adb forward也转发了,就是行不行。PC端是VC++写的。socket显示成功了。IP给的是127.0.0.1,但是数据接收不到。手机端socket卡在accept这一步。晕死 --------------------编程问答--------------------
引用 4 楼 zhangweiit 的回复:
可以看看是否有以下几个问题
系统防火墙问题
adb forward tcp:1234 tcp 1234是否成功执行(可以使用telnet localhost 1234检查)

代码上,apk应该先listen 1234端口,循环accept接收请求
然后vc在PC上connect
如果connect可以成功,说明连上了

你可以在apk那边log一下accept的结果,看是否成功收到新客户端
在accept成功之后,会有新socket建立,利用这个新socket发送字节流,PC自然能收得到

你先按这个做一下吧,有什么问题再具体说
原先我做过一个安卓PC助手,有点小经验

你好,请问你以前成功进行socket的时候。PC端用什么IP来和手机connect的??听说forward以后用127.0.0.1来连接,但是我一直没成功过。 --------------------编程问答-------------------- 基本,这是本机通信,不涉及IP问题,ADB直接帮你转发过去,localhost,127.0.0.1都可以
可否看你代码 --------------------编程问答-------------------- 连不上的几点原因
1,PC防火墙
2,没有先启动APK
3,启动APK后才在PC上调用adb forward命令
4,最后才是PC去连APK


APK是作为服务端的 --------------------编程问答--------------------
引用 8 楼 zhangweiit 的回复:
连不上的几点原因
1,PC防火墙
2,没有先启动APK
3,启动APK后才在PC上调用adb forward命令
4,最后才是PC去连APK


APK是作为服务端的
PC端是socket客户端:代码如下
#include <WinSock2.h>
#include <fstream>
#include <iostream>

using namespace std;

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1,1);
err = WSAStartup(wVersionRequested,&wsaData);
if (err !=0)
{
return;
}
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion)!= 1)
{
WSACleanup();
return;
}

SOCKET sockClient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
SOCKADDR_IN addSrv;
addSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addSrv.sin_family = AF_INET;
addSrv.sin_port = htons(12580);
connect(sockClient,(SOCKADDR*)&addSrv,sizeof(SOCKADDR));
cout << GetLastError() <<endl;
char data[1024] = {0};
recv(sockClient,data,1024,0);
cout << "收到数据:"<<data << endl;
closesocket(sockClient);
WSACleanup();
}
--------------------编程问答--------------------
引用 8 楼 zhangweiit 的回复:
连不上的几点原因
1,PC防火墙
2,没有先启动APK
3,启动APK后才在PC上调用adb forward命令
4,最后才是PC去连APK


APK是作为服务端的
手机端代码:
protected void onCreate(Bundle savedInstanceState) 
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start_app);
     Button btn = (Button)findViewById(R.id.BTN1);
     btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v)//处理事件
{
ServerSocket server = null;
try 
{
server = new ServerSocket(10086);

catch (IOException e)
{
e.printStackTrace();
    AlertDialog.Builder dialog=new AlertDialog.Builder(StartApp.this);  
    dialog.setMessage("创建socket出错");
}
while(true)
{
try 
{
Socket client = server.accept();
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(  
client.getOutputStream())), true);  
out.write("abcdefg");
out.flush();
} catch (IOException e) {
e.printStackTrace();
AlertDialog.Builder dialog=new AlertDialog.Builder(StartApp.this);  
dialog.setMessage("accpet出错");
}
}
}
});
}
--------------------编程问答-------------------- 但是现在手机端,我不知道该怎么写,这个有BUG,手机端会直接卡死,还请赐教。我只想从手机通过USB发送一些数据到PC上。 adb forward tcp:12580 tcp:10086是我手动打命令行的 --------------------编程问答-------------------- apk这边:server = new ServerSocket(10086);
PC这边:addSrv.sin_port = htons(12580);
两边端口对不上啊

同时,一定要注意顺序,要按这三步
1,启动APK
2,adb的forward
3,启动PC端EXE --------------------编程问答--------------------
引用 12 楼 zhangweiit 的回复:
apk这边:server = new ServerSocket(10086);
PC这边:addSrv.sin_port = htons(12580);
两边端口对不上啊

同时,一定要注意顺序,要按这三步
1,启动APK
2,adb的forward
3,启动PC端EXE
两边端口不是用forward 重定向了吗?那他们如果都是12580. 那么forward是不是也要写成adb forward tcp:12580 tcp:12580
还有我的手机端会卡死,能帮忙看下码。我不会安卓。。临时百度来的代码。 --------------------编程问答-------------------- 最主要先要确认是否有正常链接成功
然后再到数据处理的一步
还有个简单手法我通常都是在局域网手机链接无线,然后再链接我的服务器测试,你这种没有尝试过,只能帮忙顶下,不要见怪 --------------------编程问答-------------------- 你把你forward的命令贴出来看一下 --------------------编程问答-------------------- adb forward tcp:12580 tcp:10086
以我的理解,这是把PC端发往12580端口的数据重定向到手机的10086端口,避免了需要IP。 --------------------编程问答-------------------- 是的,端口没错,我刚才上面有几句可能会误导了你
--------------------编程问答--------------------
引用 17 楼 zhangweiit 的回复:
是的,端口没错,我刚才上面有几句可能会误导了你

该注意的几点我都注意了就是不成功。
1.xml里面的权限添加,我加了
2.adb forward转发端口,我转发了。
3.开启的顺序,我就是是先adb forward.在打开apk.服务器端开启socket等待accept客户端请求。然后再开PC端的客户端请求连到手机。。可就是没结果。防火墙被我关了。。 --------------------编程问答-------------------- apk这边:server = new ServerSocket(10086);
 PC这边:addSrv.sin_port = htons(12580);
两边端口对不上啊

我上面这句话说错,可能误导了你,因为当时我只看端口不一样

只要你forward tcp:12580 tcp:10086,端口就可以这样 --------------------编程问答-------------------- 你要打印accpet的结果啊 --------------------编程问答-------------------- 在apk上,你使用logcat看一下accept的结果,在eclipse里面可以看到的
在PC上,你也要看一下connect的返回值和GetLastError的值 --------------------编程问答--------------------
引用 20 楼 zhangweiit 的回复:
你要打印accpet的结果啊

额。咋打印啊。。。不会诶,我安卓代码都是百度来的。。。。我是做C++的。目前需要获取手机的一点信息,百度点代码,已经可以在手机端获取信息了。现在是手机获取好了信息不知道怎么通过USB发送到PC。如果把数据持久化,然后用adb pull出来时可以实现的,但是这种办法毕竟不是最佳方案,想用socket弄了2天也没出来。。能麻烦你,写一段最短的安卓作为服务器端socket程序吗?只需要accept客户端请求,然后连接上了发送一个字符串回去就好 --------------------编程问答--------------------
引用 21 楼 zhangweiit 的回复:
在apk上,你使用logcat看一下accept的结果,在eclipse里面可以看到的
在PC上,你也要看一下connect的返回值和GetLastError的值

PC端getlasterror是没问题的,返回0.操作正确完成了,我就郁闷了。按道理服务端没成功,客户端应该阻塞的 --------------------编程问答-------------------- 那,在apk那边,你有看一下accept出来的那个socket的信息么?
--------------------编程问答--------------------
引用 24 楼 zhangweiit 的回复:
那,在apk那边,你有看一下accept出来的那个socket的信息么?

。。。我不会看啊。是不是log.v(); v()里面的参数怎么设呢??
   server= new ServerSocket(10086);  
      socket = server.accept();
log.v(???); --------------------编程问答-------------------- Log.v("mytag", "你想要的信息"); --------------------编程问答-------------------- 我下班了,兄弟,你慢慢调,加油 --------------------编程问答--------------------
引用 27 楼 zhangweiit 的回复:
我下班了,兄弟,你慢慢调,加油


引用 27 楼 zhangweiit 的回复:
我下班了,兄弟,你慢慢调,加油

88....... --------------------编程问答-------------------- 其实,我还真一下看不出来有什么问题
只能说,我原来做的时候,没有经过BufferredOutput

直接cient.getOutputStream().write("")就可以

还有,你一定 要用eclipse看一下logcat的输出 --------------------编程问答-------------------- recv(sockClient,data,1024,0);
这一句改一下

int iRecvLen = recv(sockClient,data,1024,0);
if(iRecvLen > 0){
  data[iRecvLen] = '\0';
  cout<<"recv succeed:"<<data<<endl;
}else{
  cout<<"recv fail"<<endl;
} --------------------编程问答-------------------- 纠正一下我上面一个回复的错误
cient.getOutputStream().write("")
OutputStream没有write(String str)这个重载
只有write(byte[])

要把字符变成byte[]
必须用String.getBytes() --------------------编程问答--------------------
引用 31 楼 zhangweiit 的回复:
纠正一下我上面一个回复的错误
cient.getOutputStream().write("")
OutputStream没有write(String str)这个重载
只有write(byte[])

要把字符变成byte[]
必须用String.getBytes()

我弄出来了。。。但是今天需要调整一下代码逻辑,现在还在看如何用PC发命令启动boradcast来开启服务。。 --------------------编程问答-------------------- PC上发broadcast到设备
adb shell am broadcast -a 你apk中定义的action名称

然后,在你apk中创建一个BroadcastReceiver
并定义一个intent-filter

 <intent-filter>    
                <action android:name="com.apkok.gdsprite.start"></action> --------------------编程问答-------------------- 上面是节选自我原来做的项目中的。

顺便问一下,昨天你连不上socket是什么原因? --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 34 楼 zhangweiit 的回复:
上面是节选自我原来做的项目中的。

顺便问一下,昨天你连不上socket是什么原因?

运行的顺序不对。后来按照你说的,先转换接口,然后APK,最后PC。就可以了。好像还有一个是,APK端Socket要循环的去监听是否有客户端要连接进来。以前只是用一个accept().现在是循环判断。 --------------------编程问答-------------------- 一般都会在accept或者select,甚至recv上加循环
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,