【发布时间】:2019-05-15 10:19:06
【问题描述】:
好的,所以我阅读了很多问题,但无法弄清楚。我从我的 Android 应用程序收到的数据遇到问题。基本上我想控制伺服。该代码有效,但应用程序发送到服务器的数据是在单独的行中接收的。是的,我知道我需要使用缓冲区,我进行了一些研究,但找不到在我的代码中添加缓冲区的方法。 此外,我认为我不需要展示我的 Java 代码,因为它只是从按钮点击发送的基本命令(向上、向下等字符串)。
...Python Code(Server)...
ctrCmd = ['Up','Down', 'ON', 'OFF']
...
...
while True:
print ("Waiting for connection")
tcpCliSock,addr = tcpSerSock.accept()
print ("...connected from :", addr)
try:
while True:
data = ''
data = tcpCliSock.recv(BUFSIZE).decode()
print("This",data)
if not data:
print ("No Data",data)
break
if data == ctrCmd[0]:
print("I am here")
Servomotor.ServoUp()
print ("Increase: ",Servomotor.cur_X)
#tcpCliSock.send("Servo Increases".encode())
if data == ctrCmd[1]:
Servomotor.ServoDown()
print ("Decrease: ",Servomotor.cur_X)
#tcpCliSock.send("Servo Decreases".encode())
if data == ctrCmd[2]:
Servomotor.ledOn()
print ("Led On")
#tcpCliSock.send("Led On".encode())
if data == ctrCmd[3]:
Servomotor.ledOff()
print ("Led Off")
# tcpCliSock.send("Led Off".encode())
except KeyboardInterrupt:
Servomotor.close()
GPIO.cleanup()
tcpSerSock.close();
我也不明白为什么它显示没有数据,即使它显示收到的数据? 请帮助我真的是一个菜鸟,正在努力学习。 谢谢!!
更新!! 在我更改了 decode() 建议后,
public class MainActivity extends AppCompatActivity {
//UI Element
Button btnUp;
Button btnDown;
Button btnLedOn;
Button btnLedOff;
EditText txtAddress;
/*TextView message;*/
Socket myAppSocket = null;
public static String wifiModuleIp = "";
public static int wifiModulePort = 0;
public static String CMD = "0";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnUp = (Button) findViewById(R.id.btnUp);
btnDown = (Button) findViewById(R.id.btnDown);
btnLedOn = (Button) findViewById(R.id.btnLedOn);
btnLedOff = (Button) findViewById(R.id.btnLedOff);
txtAddress = (EditText) findViewById(R.id.ipAddress);
/*message = (TextView) findViewById(R.id.message);*/
btnUp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getIPandPort();
CMD = "Up";
Socket_AsyncTask cmd_increase_servo = new Socket_AsyncTask();
cmd_increase_servo.execute();
}
});
btnDown.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getIPandPort();
CMD = "Down";
Socket_AsyncTask cmd_increase_servo = new Socket_AsyncTask();
cmd_increase_servo.execute();
}
});
btnLedOn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getIPandPort();;
CMD = "ON";
Socket_AsyncTask cmd_led_on = new Socket_AsyncTask();
cmd_led_on.execute();
}
});
btnLedOff.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getIPandPort();
CMD = "OFF";
Socket_AsyncTask cmd_led_off = new Socket_AsyncTask();
cmd_led_off.execute();
}
});
}
public void getIPandPort()
{
String iPandPort = txtAddress.getText().toString();
Log.d("MYTEST","IP String: "+ iPandPort);
String temp[]= iPandPort.split(":");
wifiModuleIp = temp[0];
wifiModulePort = Integer.valueOf(temp[1]);
Log.d("MY TEST","IP:" +wifiModuleIp);
Log.d("MY TEST","PORT:"+wifiModulePort);
}
public class Socket_AsyncTask extends AsyncTask<Void,Void,Void>
{
Socket socket;
@Override
protected Void doInBackground(Void... params){
try{
InetAddress inetAddress = InetAddress.getByName(MainActivity.wifiModuleIp);
socket = new java.net.Socket(inetAddress,MainActivity.wifiModulePort);
//read input msg from server
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataOutputStream.writeBytes(CMD);
System.out.println(CMD);
dataOutputStream.close();
socket.close();
}catch (UnknownHostException e){e.printStackTrace();}catch (IOException e){e.printStackTrace();}
return null;
}
}
}
【问题讨论】:
-
您好,您的缓冲区大小是多少?
-
嘿!..是1024
-
如果您尝试将缓冲区大小增加到 2048?
-
是的,我做到了,仍然是同样的事情,当我在 python 2 中写回相同的代码时,它运行良好,但是在 python 3 或发生的事情之后,它给出了这种输出,它给出了正确的如果我在我的 Android 应用程序上单击“向上”按钮 5-10 次,则输出。但随后它发送多个输入并且伺服移动额外的旋转。
标签: java android python sockets