最近在写一个小APP,卡在android与服务器端通讯上了,大致需求是,android端发送二进制数据,文件头为0x00 0x08 0x0b,后面跟字符串的内容为abcd_efdgh, 结尾用0x00。
写了个demo,即在editText中输入字符,然后点按钮发送时通过 getText().toString().getBytes()转成二进制格式,经socket发出,但是貌似服务器无响应。
代码如下:
写了个demo,即在editText中输入字符,然后点按钮发送时通过 getText().toString().getBytes()转成二进制格式,经socket发出,但是貌似服务器无响应。
代码如下:
public class MainActivity extends Activity {
private EditText ed_tex;
private Button btn_sent;
private int SERVER_POINT = 2041;
private String SERVER_ADDRESS = "192.168.18.127";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
// TODO Auto-generated method stub
ed_tex = (EditText) findViewById(R.id.ed_text);
btn_sent = (Button) findViewById(R.id.btn_sent);
btn_sent.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
byte[] str= ed_tex.getText().toString().getBytes();//截取输入字符串中的数值变成二进制
if (v != null && !str.equals("")) {
System.out.println("准备发送....");
new SendThred(str).start();
}
}
});
}
class SendThred extends Thread implements Runnable {
byte[] Str_message;
public SendThred(byte[] str){
this.Str_message = str;//自定义线程发送输入字节
}
public void run() {
try {
System.out.println("正在连接服务器...");
Socket s = new Socket(SERVER_ADDRESS, SERVER_POINT);
System.out.println("成功连接服务器...");
System.out.println("准备发送数据...");
DataOutputStream out = new DataOutputStream(s.getOutputStream());
out.write(Str_message);
System.out.println("成功发送数据...");
System.out.println("准备接收服务器返回结果...");
DataInputStream is = new DataInputStream(s.getInputStream());
System.out.println("成功接收服务器返回数据:" + is.readUTF());
//System.out.println("成功接收服务器返回数据:" + is.read());
Toast.makeText(getApplicationContext(), "成功接收服务器返回数据:" + is.readUTF(), Toast.LENGTH_SHORT).show();
is.close();
out.close();
s.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
解决方案
20
第一,你构造的协议呢?本人看你直接把字符串转成的字节数组发出去了,协议头和协议尾呢?你没有加啊,有可能服务端看接收到的不是以规定的字节开头的抛弃了没有处理。
第二,你们传的字符串转成字节数组是约定的用UTF-8编码吗?
第三,涉及到本人构造协议,已经不是基本数据类型了,不要用DataInputStream和DataOutputStream。
当然以上只是一些建议,你试试吧,不一定对。
第二,你们传的字符串转成字节数组是约定的用UTF-8编码吗?
第三,涉及到本人构造协议,已经不是基本数据类型了,不要用DataInputStream和DataOutputStream。
当然以上只是一些建议,你试试吧,不一定对。
10
服务器需要给你这边写你才能接受的,服务器写了用write(outstream),把输出流写出,还要用flush()强制刷新缓冲流,才能写出来,你可以检查下这个