工作在一个宠物项目从Android设备为我的电脑创建一个工作鼠标,我有一台运行在PC上的python服务器和android应用程序向它发送所需的数据。Python套接字缓冲和数据丢失
我对创建鼠标的想法是使用Motion_Event UP和MOVE在设备屏幕上记录您的手指移动,计算您的最后和新x,y坐标之间的差异,并将差异发送到PC,以便移动鼠标在相同的模式
现在我有几个问题从发送自己到计算,我真的想让你们的意见,我应该如何做这个更好的算法明智或只是一个糟糕的实现代码在我的部分。
的Java:
@Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
oldX = (int) event.getX();
oldY = (int) event.getY();
}
else if(event.getAction() == MotionEvent.ACTION_MOVE){
newX = (int) event.getX();
newY = (int) event.getY();
xDiff = newX - oldX;
yDiff = newY - oldY;
Log.v("xdiff", ""+xDiff);
Log.v("ydiff", ""+yDiff);
oldX = newX;
oldY = newY;
a.mouse(xDiff, yDiff);
}
else if(event.getAction() == MotionEvent.ACTION_UP){
}
return true;
}
插座:
@Override
protected Void doInBackground(Void... params) {
try {
this.sock = new Socket("10.0.0.2", 9871);
outToServer = new DataOutputStream(this.sock.getOutputStream());
}
catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public void mouse(int x, int y) {
try {
this.outToServer.writeBytes(""+x+","+y);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
蟒蛇插座:
def __init__(self, IP, port):
try:
self.acceptor = socket.socket()
self.acceptor.bind((IP, port))
self.acceptor.listen(1)
except socket.error, e:
print e
def start_server(self):
try:
print "serv up"
self.sock, self.connecting_ip = self.acceptor.accept()
print self.connecting_ip[0] + " connected!"
except socket.error, e:
print e
数据处理本身:
def mouse(self):
try:
while True:
data = self.sock.recv(1024)
if data:
coords = data.split(",")
x = int(coords[0])
y = int(coords[1])
current_x = win32api.GetCursorPos()[0]
current_y = win32apo.GetCursorPos()[1]
win32api.SetCursorPos((current_x+x,current_y+y))
else:
self.sock.close()
except socket.error, e:
print e
我得到的问题是:
1)而不是像我发送它(“”+ x +“,”+ y)获取数据,它将更多的数据加载到缓冲区,并出现为x,y ,x,y,x,y,x,y,x,y,x,y ... 我试图搞乱缓冲区大小但是没有做太多 (注意关于这个的奇怪的是我不知道当我在我的模拟器上运行应用程序时,我得到了这个错误,并且我准确地得到了我想要进入缓冲区的x,y,但是当我在我的android设备上运行它时(如果它全部是SGS2的话)事情)的数据去掩体,并一次全部发送)
2)我得到的另一件事是数据被“损坏”或缺少发送''而不是一个数字或有4和-5发送4-5而不是4,-5
总而言之,我很确定我已经在这里主要搞砸了,我希望有人能够阐明我应该怎么去关于这样做。
UDP实现:
@Override
protected Void doInBackground(Void... params) {
try {
this.clientSocket = new DatagramSocket();
this.IPAddress = InetAddress.getByName("10.0.0.2");
this.sendData = new byte[1024];
}
catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public void mouse(int x, int y) {
try {
String sentence = "{" + x + "," + y + "}";
this.sendData = sentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(this.sendData, this.sendData.length, this.IPAddress, 9871);
this.clientSocket.send(sendPacket);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
蟒UDP SERV:
import socket
PORT = 9871
IP = socket.gethostbyname(socket.gethostname())
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
sock.bind((IP, PORT))
print "Server %s" % IP
while True:
data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
if data:
print "received message:", data
else:
print "dead"
我试图改变我的代码以使用UDP,因为它确实看起来更加的方式使用的逻辑在这种情况下是,但我确实遇到了另外一个奇怪的问题,我已经实现了新的代码为蟒蛇和Android应用程序,它完美的工作(数据发送),但只在模拟器上,当我尝试从我的设备,它只是崩溃..(我已经添加了新的代码到我的文章) – Shay