手机通过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)

也接受不到
卧槽。。到底怎么才能收到呢。。没搞过安卓
求教

解决方案 »

  1.   

    PC端的windows防火墙端口打开了吗?
      

  2.   

    在Android端用工具试试服务端1234端口能ping通吗?
      

  3.   

    可以看看是否有以下几个问题
    系统防火墙问题
    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助手,有点小经验
      

  4.   

    我次奥too.我也在弄这个,手机端获取了APK信息和图标想发到PC上。Socket两天都没成功,我是PC做客户端,手机做服务器端。intenet权限也加了,adb forward也转发了,就是行不行。PC端是VC++写的。socket显示成功了。IP给的是127.0.0.1,但是数据接收不到。手机端socket卡在accept这一步。晕死
      

  5.   

    你好,请问你以前成功进行socket的时候。PC端用什么IP来和手机connect的??听说forward以后用127.0.0.1来连接,但是我一直没成功过。
      

  6.   

    基本,这是本机通信,不涉及IP问题,ADB直接帮你转发过去,localhost,127.0.0.1都可以
    可否看你代码
      

  7.   

    连不上的几点原因
    1,PC防火墙
    2,没有先启动APK
    3,启动APK后才在PC上调用adb forward命令
    4,最后才是PC去连APK
    APK是作为服务端的
      

  8.   

    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();
    }
      

  9.   

    手机端代码: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出错");
    }
    }
    }
    });
    }
      

  10.   

    但是现在手机端,我不知道该怎么写,这个有BUG,手机端会直接卡死,还请赐教。我只想从手机通过USB发送一些数据到PC上。 adb forward tcp:12580 tcp:10086是我手动打命令行的
      

  11.   

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

  12.   

    两边端口不是用forward 重定向了吗?那他们如果都是12580. 那么forward是不是也要写成adb forward tcp:12580 tcp:12580
    还有我的手机端会卡死,能帮忙看下码。我不会安卓。。临时百度来的代码。
      

  13.   

    你把你forward的命令贴出来看一下
      

  14.   

    adb forward tcp:12580 tcp:10086
    以我的理解,这是把PC端发往12580端口的数据重定向到手机的10086端口,避免了需要IP。
      

  15.   


    该注意的几点我都注意了就是不成功。
    1.xml里面的权限添加,我加了
    2.adb forward转发端口,我转发了。
    3.开启的顺序,我就是是先adb forward.在打开apk.服务器端开启socket等待accept客户端请求。然后再开PC端的客户端请求连到手机。。可就是没结果。防火墙被我关了。。
      

  16.   

    apk这边:server = new ServerSocket(10086);
     PC这边:addSrv.sin_port = htons(12580);
    两边端口对不上啊我上面这句话说错,可能误导了你,因为当时我只看端口不一样只要你forward tcp:12580 tcp:10086,端口就可以这样
      

  17.   

    在apk上,你使用logcat看一下accept的结果,在eclipse里面可以看到的
    在PC上,你也要看一下connect的返回值和GetLastError的值
      

  18.   

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

  19.   

    PC端getlasterror是没问题的,返回0.操作正确完成了,我就郁闷了。按道理服务端没成功,客户端应该阻塞的
      

  20.   

    那,在apk那边,你有看一下accept出来的那个socket的信息么?
      

  21.   

    我不会看啊。是不是log.v(); v()里面的参数怎么设呢??
       server= new ServerSocket(10086);  
          socket = server.accept();
    log.v(???);
      

  22.   

    Log.v("mytag", "你想要的信息");
      

  23.   

    其实,我还真一下看不出来有什么问题
    只能说,我原来做的时候,没有经过BufferredOutput直接cient.getOutputStream().write("")就可以还有,你一定 要用eclipse看一下logcat的输出
      

  24.   

    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;
    }
      

  25.   

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

  26.   

    我弄出来了但是今天需要调整一下代码逻辑,现在还在看如何用PC发命令启动boradcast来开启服务。。
      

  27.   

    PC上发broadcast到设备
    adb shell am broadcast -a 你apk中定义的action名称然后,在你apk中创建一个BroadcastReceiver
    并定义一个intent-filter <intent-filter>    
                    <action android:name="com.apkok.gdsprite.start"></action>
      

  28.   

    上面是节选自我原来做的项目中的。顺便问一下,昨天你连不上socket是什么原因?
      

  29.   

    运行的顺序不对。后来按照你说的,先转换接口,然后APK,最后PC。就可以了。好像还有一个是,APK端Socket要循环的去监听是否有客户端要连接进来。以前只是用一个accept().现在是循环判断。
      

  30.   

    一般都会在accept或者select,甚至recv上加循环