PC客户端与Android服务端的Socket同步通信(USB)

时间:2021-11-08 15:56:28
一个android端的service后台运行的程序,作为socket的服务器端;用于接收Pc client端发来的命令,来处理数据后,把结果发给PC client

上代码:
PC客户端:
[code=JScriptpublic] 
class TestPcClient {
public static void main(String[ args) {
try {
Runtime.getRuntime().exec("adb forward tcp:12580 tcp:10086");
System.out.println(1111);
Thread.sleep(3000);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Socket socket = null;
try {
InetAddress serverAddr = null;
String ip = InetAddress.getLocalHost().getHostAddress();    
System.out.println(ip);
serverAddr = InetAddress.getByName("10.0.2.2");   
System.out.println("TCP 1111" + "C: Connecting...");
socket = new Socket(serverAddr, 12580);
String str = "hi,nihao";
System.out.println("TCP 221122" + "C:RECEIVE");
BufferedOutputStream out = new BufferedOutputStream(
socket.getOutputStream());
BufferedInputStream in = new BufferedInputStream(
socket.getInputStream());
boolean flag = true;
while (flag) {
out.write("kehuduanfasongfang".getBytes());
out.flush();
String strFormsocket = readFromSocket(in);
System.out.println("the data sent by server is:\r\n" + strFormsocket);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public static String readFromSocket(InputStream in) {
int MAX_BUFFER_BYTES = 4000;
String msg = "";
byte[] tempbuffer = new byte[MAX_BUFFER_BYTES];
try {
int numReadedBytes = in.read(tempbuffer, 0, tempbuffer.length);
msg = new String(tempbuffer, 0, numReadedBytes, "utf-8");
tempbuffer = null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return msg;
}]
[/code]


android手机服务端代码:
AndroidService类:
public class AndroidService extends Service{
public static final String TAG ="TAG";
public static Boolean mainThreadFlag = true;
public static Boolean ioThreadFlag = true;
ServerSocket serverSocket =null;
public static final int SERVER_PORT =10086;
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
new Thread(){
public void run() {
doListen();
};
}.start();
}

@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
private void doListen(){
serverSocket =null;
try {
serverSocket = new ServerSocket(SERVER_PORT);
boolean mainThreadFlag =true;
while(mainThreadFlag){
Log.i("test", "accept----");
Socket client = serverSocket.accept();
new Thread(new ThreadReadWriterIOSocket(this, client)).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
mainThreadFlag = false;
ioThreadFlag =false;
//关闭服务器
try {
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

ThreadReadWriterIOSocket类:
public class ThreadReadWriterIOSocket extends Thread{
private Socket client;
private Context context;
public ThreadReadWriterIOSocket(Context context, Socket socket) {
// TODO Auto-generated constructor stub
this.client = socket;
this.context = context;
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
BufferedOutputStream out;
BufferedInputStream in;
Log.i("test", "receiver--");
String currCMD ="";
try {
out = new BufferedOutputStream(client.getOutputStream());
in = new BufferedInputStream(client.getInputStream());
AndroidService.ioThreadFlag=true;
while(AndroidService.ioThreadFlag){
if(!client.isConnected()){
break;
}
currCMD = readCMDFromSocket(in);
Log.v("test", "in.read------"+currCMD);
out.write("OK".getBytes());
out.flush();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public static String readCMDFromSocket(InputStream in){
int MAX_BUFFER_BYTES =2048;
String msg ="";
byte[] tempBuffer = new byte[MAX_BUFFER_BYTES];
try {
int numReadedBytes = in.read(tempBuffer);
msg = new String(tempBuffer,0,numReadedBytes,"utf-8");
tempBuffer =null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return msg;
}
}

首先启动 手机端服务器:accept()等待正常:
其次启动 pc客户端:
错误显示:TCP 1111C: Connecting...
java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:525)
at java.net.Socket.connect(Socket.java:475)
at java.net.Socket.<init>(Socket.java:372)
at java.net.Socket.<init>(Socket.java:215)
at com.flying.tcpclientdemo.TestPcClient.main(TestPcClient.java:27)

socket = new Socket(serverAddr, 12580);出现错误 连接不上 求高手指点 ,万分感激!

13 个解决方案

#1


你确认那个USB上可以支持TCP/IP 协议么?

#2


这个应该可以的吧,网上很多人貌似就实现了

#3


明显网络不通,

#4


没加权限,在mainfirst.xml中加internet权限!

#5


权限加了,是网络不通,现在找不到原因,麻烦看看!

#6


学习~

#7


  从代码上没看出什么问题,不过,在程序运行的时候,可以检查下,abd forward命令是否执行成功了。

#8


我也是PC端连不上真机上的服务端。现在还没找到原因。。。

#9


serverAddr = InetAddress.getByName("10.0.2.2");  
System.out.println("TCP 1111" + "C: Connecting..."); 
socket = new Socket(serverAddr, 12580); 


public static final int SERVER_PORT =10086;
怎么port都不匹配啊

#10


一个android端的service后台运行的程序,作为socket的服务器端;用于接收Pc client端发来的命令,来处理数据后,把结果发给PC client

我觉得server最好放在PC端,毕竟IP地址相对固定

#11


你把地址改成127.0.0.1 就行了

#12


引用 11 楼 yykxlgh 的回复:
你把地址改成127.0.0.1 就行了


改IP

#13


第一:协议
 第二:IP 
第三:编码
第四:数据接收传输
第五:权限

都查一下!


#1


你确认那个USB上可以支持TCP/IP 协议么?

#2


这个应该可以的吧,网上很多人貌似就实现了

#3


明显网络不通,

#4


没加权限,在mainfirst.xml中加internet权限!

#5


权限加了,是网络不通,现在找不到原因,麻烦看看!

#6


学习~

#7


  从代码上没看出什么问题,不过,在程序运行的时候,可以检查下,abd forward命令是否执行成功了。

#8


我也是PC端连不上真机上的服务端。现在还没找到原因。。。

#9


serverAddr = InetAddress.getByName("10.0.2.2");  
System.out.println("TCP 1111" + "C: Connecting..."); 
socket = new Socket(serverAddr, 12580); 


public static final int SERVER_PORT =10086;
怎么port都不匹配啊

#10


一个android端的service后台运行的程序,作为socket的服务器端;用于接收Pc client端发来的命令,来处理数据后,把结果发给PC client

我觉得server最好放在PC端,毕竟IP地址相对固定

#11


你把地址改成127.0.0.1 就行了

#12


引用 11 楼 yykxlgh 的回复:
你把地址改成127.0.0.1 就行了


改IP

#13


第一:协议
 第二:IP 
第三:编码
第四:数据接收传输
第五:权限

都查一下!