android 怎么样用socket给C服务器 发送二进制数据

Android 码拜 4年前 (2017-04-15) 456次浏览
最近在写一个小APP,卡在android与服务器端通讯上了,大致需求是,android端发送二进制数据,文件头为0x00 0x08 0x0b,后面跟字符串的内容为abcd_efdgh, 结尾用0x00。
写了个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。
当然以上只是一些建议,你试试吧,不一定对。

10

服务器需要给你这边写你才能接受的,服务器写了用write(outstream),把输出流写出,还要用flush()强制刷新缓冲流,才能写出来,你可以检查下这个

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明android 怎么样用socket给C服务器 发送二进制数据
喜欢 (0)
[1034331897@qq.com]
分享 (0)