好的,所以我读了很多问题,无法解决。我从Android应用程序接收到的数据面临问题。基本上我想控制一个伺服器。该代码有效,但是应用发送到服务器的数据在单独的行中接收。是的,我知道我需要使用缓冲区,我做了一些研究,但找不到找到在我的代码中添加缓冲区的方法。
另外,我认为我不需要显示Java代码,因为它只是从按钮单击发送的基本命令(如Up,Down等字符串)。
...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;
}
}
}
Android代码的输出
5月17日更新
我试过了writeUTF,它在Up之前给出了一些空数据(参见图片)
最佳答案
试试看:
socket = new java.net.Socket(inetAddress,MainActivity.wifiModulePort);
//read input msg from server
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataOutputStream.writeChars(CMD);
System.out.println(CMD);
dataOutputStream.close();
socket.close();
如果这增加了额外的空间,那么简单的解决方案将是继续使用writeutf并在服务器端对数据进行子字符串化
socket =新的java.net.Socket(inetAddress,MainActivity.wifiModulePort);
//read input msg from server
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataOutputStream.writeUTF(CMD);
System.out.println(CMD);
dataOutputStream.close();
socket.close();
在服务器端:
data = tcpCliSock.recv(BUFSIZE).decode()
data = data[2:]
引用Javadoc:
使用修改后的UTF-8将字符串写入基础输出流
以与机器无关的方式进行编码。
首先,将两个字节写入输出流,就像
writeShort方法给出了要跟随的字节数。这个值是
实际写出的字节数,而不是长度
串。按照长度,输出字符串的每个字符,
按顺序,对字符使用修改后的UTF-8编码。如果
没有引发异常,写入的计数器将增加
写入输出流的字节总数。这将在
至少两个加上str的长度,并且最多两个加上三次
长度