Probelm与服务器客户端应用程序一起使用Usb和Adb(Android&;Node.js)
我正在尝试使用usb将坐标从手机发送到电脑。 我正在使用Socket.io将Node.js服务器与android客户端连接,我正在使用Probelm与服务器客户端应用程序一起使用Usb和Adb(Android&;Node.js),android,node.js,socket.io,adb,Android,Node.js,Socket.io,Adb,我正在尝试使用usb将坐标从手机发送到电脑。 我正在使用Socket.io将Node.js服务器与android客户端连接,我正在使用 adb反向tcp:9002 tcp:9002连接端口 Node.js-Server的外观如下: const express = require('express'), http = require('http'), app = express(), server = http.createServer(app), io = require('socket.io'
adb反向tcp:9002 tcp:9002
连接端口
Node.js-Server的外观如下:
const express = require('express'),
http = require('http'),
app = express(),
server = http.createServer(app),
io = require('socket.io').listen(server);
app.get('/', (req, res) => {
res.send('Server is running on port 9002')
});
io.on('connection',(socket) =>{
console.log('Android Connected')
socket.on('join', function() {
console.log('Android Ready')
//res.send('Android just connected')
socket.broadcast.emit('userjoinedthechat', " : Android has joined ")
});
socket.on('message',(messageContent) => {
console.log(messageContent)
var numbers = messageContent.match(/\d+/g).map(Number);
var x = numbers[0];
var y = numbers[1];
console.log("Thats X: " +x+ "and Y: "+y);
});
socket.on('disconnect', function(){
console.log('Android has left');
})
})
server.listen(9002,()=>{
console.log('Node app is running on port 9002')
});
这是Android客户端的主要活动:
package com.example.calibrator;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Point;
import android.os.Bundle;
import android.view.Display;
import android.view.MotionEvent;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.FrameLayout.LayoutParams;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private int screenWidth;
private int screenHeight;
private IOSender io;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Get Screenheight and Screenwidth of the Display
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
screenWidth = size.x;
screenHeight = size.y;
// set the Layout to fit the Screen
RelativeLayout layout = (RelativeLayout) findViewById(R.id.layout);
LayoutParams layoutParams = new LayoutParams(screenWidth,screenHeight);
layout.setLayoutParams(layoutParams);
if(getSupportActionBar() != null){
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
}
io = new IOSender();
io.connect();
}
@Override
public boolean onTouchEvent(MotionEvent e){
RelativeLayout layout = findViewById(R.id.layout);
//MessageSender messageSender= new MessageSender();
//JSSender jsSender = new JSSender();
//Points where the Display is touched
int points = e.getPointerCount();
//useless?
layout.removeAllViews();
//clean the Layout if the last Finger is up
if(e.getAction() == MotionEvent.ACTION_UP){
layout.removeAllViews();
}else{
//Show Coordinates of the Touch
for(int i = 0; i < points;i++){
TextView textView = new TextView(this);
int x = (int)e.getX(i);
int y = (int)e.getY(i);
textView.setText("("+x+", "+y+")");
textView.setTextSize(30);
//to get the dynamic Height and Width of the TextView
textView.measure(0,0);
TextView tmp = new TextView(this);
tmp.setText(textView.getMeasuredHeight()+", "+ textView.getMeasuredWidth()+", "+ screenHeight +", "+screenWidth);
tmp.setTextSize(20);
//Too close in right corner
if ( x >= screenWidth - textView.getMeasuredWidth()&& y >= screenHeight - 2*textView.getMeasuredHeight() ) {
textView.setX(screenWidth - textView.getMeasuredWidth());
textView.setY(screenHeight - 2 * textView.getMeasuredHeight());
// Too close to right
}else if ( x >= screenWidth - textView.getMeasuredWidth()){
textView.setX(screenWidth - textView.getMeasuredWidth());
textView.setY(y);
// Too close to Bottom
} else if ( y >= screenHeight - 2*textView.getMeasuredHeight()){
textView.setX(x);
textView.setY(screenHeight - 2*textView.getMeasuredHeight());
} else {
textView.setX(x);
textView.setY(y);
}
layout.addView(tmp);
layout.addView(textView);
if(i==0) {
//messageSender.execute(textView.getText().toString());
//jsSender.execute(textView.getText().toString());
if(io.socket.connected()){
Toast.makeText(MainActivity.this, "Socket Connected!!",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this, "No connection found",Toast.LENGTH_SHORT).show();
}
io.send(textView.getText().toString());
}
}
}
return true;
}
}
几天前它还起了短暂的作用,但现在他们再也找不到对方了。
据我所知,没有对代码进行任何更改,我现在也不知道我的代码出了什么问题。我终于找到了解决问题的方法。 对于Android 9及以上版本,您必须添加
Android:usesCleartextTraffic=“true”
以显示,否则应用程序会直接阻止流量,而不会以任何方式通知您。
现在它可以正常工作。请检查设备、node js服务器和android客户端是否在同一网络上。另外,在您的
connect()
方法中,不要使用127.0.0.1
,而是使用运行节点服务器的设备的真实IP地址,然后重试。@Atish它们都使用PC的本地主机,因为电话的127.0.0.1:9002使用adb反向tcp:9002与PC的相同地址连接。它们通过USB连接请检查防火墙或其他阻止此端口的Anit病毒软件。此外,请检查是否可以直接使用其他代码(在PC上)手动连接到套接字服务器。这是为了验证节点服务器是否工作正常。然后试着调试你手机的端口。我在本地测试了它,服务器运行没有问题,但是如果我甚至尝试使用10.0.2.2和我的端口(10.0.2.2是运行仿真器的PC的本地主机的环回地址),它将无法连接。所以这似乎是应用程序本身的问题。这很奇怪。我仍然想知道这个应用程序是否有问题。但是,如果您愿意以某种方式共享源代码,我们可以看一看。
package com.example.calibrator;
import com.github.nkzawa.socketio.client.IO;
import com.github.nkzawa.socketio.client.Socket;
import java.net.URISyntaxException;
public class IOSender {
public Socket socket;
public void connect(){
try{
socket = IO.socket("http://127.0.0.1:9002");
socket.connect();
socket.emit("join", "Android connected" );
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
public void send(String msg){
socket.emit("message",msg);
}
}