最近在写一个小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()强制刷新缓冲流,才能写出来,你可以检查下这个