手机通过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)
也接受不到
卧槽。。到底怎么才能收到呢。。没搞过安卓
求教
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)
也接受不到
卧槽。。到底怎么才能收到呢。。没搞过安卓
求教
系统防火墙问题
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助手,有点小经验
可否看你代码
1,PC防火墙
2,没有先启动APK
3,启动APK后才在PC上调用adb forward命令
4,最后才是PC去连APK
APK是作为服务端的
#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();
}
{
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出错");
}
}
}
});
}
PC这边:addSrv.sin_port = htons(12580);
两边端口对不上啊同时,一定要注意顺序,要按这三步
1,启动APK
2,adb的forward
3,启动PC端EXE
还有我的手机端会卡死,能帮忙看下码。我不会安卓。。临时百度来的代码。
以我的理解,这是把PC端发往12580端口的数据重定向到手机的10086端口,避免了需要IP。
该注意的几点我都注意了就是不成功。
1.xml里面的权限添加,我加了
2.adb forward转发端口,我转发了。
3.开启的顺序,我就是是先adb forward.在打开apk.服务器端开启socket等待accept客户端请求。然后再开PC端的客户端请求连到手机。。可就是没结果。防火墙被我关了。。
PC这边:addSrv.sin_port = htons(12580);
两边端口对不上啊我上面这句话说错,可能误导了你,因为当时我只看端口不一样只要你forward tcp:12580 tcp:10086,端口就可以这样
在PC上,你也要看一下connect的返回值和GetLastError的值
server= new ServerSocket(10086);
socket = server.accept();
log.v(???);
只能说,我原来做的时候,没有经过BufferredOutput直接cient.getOutputStream().write("")就可以还有,你一定 要用eclipse看一下logcat的输出
这一句改一下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()
adb shell am broadcast -a 你apk中定义的action名称然后,在你apk中创建一个BroadcastReceiver
并定义一个intent-filter <intent-filter>
<action android:name="com.apkok.gdsprite.start"></action>