android 如何用socket给C服务器 发送二进制数据

tingwhere 2016-10-19 09:09:05
最近在写一个小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();
}
}
}
}

...全文
253 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
小白在此 2016-10-19
  • 打赏
  • 举报
回复
第一,你构造的协议呢?我看你直接把字符串转成的字节数组发出去了,协议头和协议尾呢?你没有加啊,有可能服务端看接收到的不是以规定的字节开头的抛弃了没有处理。 第二,你们传的字符串转成字节数组是约定的用UTF-8编码吗? 第三,涉及到自己构造协议,已经不是基本数据类型了,不要用DataInputStream和DataOutputStream。 当然以上只是一些建议,你试试吧,不一定对。
tingwhere 2016-10-19
  • 打赏
  • 举报
回复
调通了,主要问题就是上面两位提到的:1, 协议头和协议尾 少了一个0x00, 将DataOutputStream 换成了OutputStream 2. 缺 flush()
tingwhere 2016-10-19
  • 打赏
  • 举报
回复
服务器端不是我写的,就是给我一个协议,告诉我发什么文件头 log直接就是卡在 System.out.println("准备接收服务器返回结果...");这里了,前面步骤走完,没有服务器反馈
引用 1 楼 u013545836 的回复:
你服务端怎么写的?接受代码贴出来啊,还有客户端这边日志打印的是什么,卡在哪一步了,也贴出来啊,不然谁知道什么情况
小白在此 2016-10-19
  • 打赏
  • 举报
回复
你服务端怎么写的?接受代码贴出来啊,还有客户端这边日志打印的是什么,卡在哪一步了,也贴出来啊,不然谁知道什么情况
xyb618 2016-10-19
  • 打赏
  • 举报
回复
服务器需要给你这边写你才能接受的,服务器写了用write(outstream),把输出流写出,还要用flush()强制刷新缓冲流,才能写出来,你可以检查下这个
tingwhere 2016-10-19
  • 打赏
  • 举报
回复
引用 3 楼 u013545836 的回复:
第一,你构造的协议呢?我看你直接把字符串转成的字节数组发出去了,协议头和协议尾呢?你没有加啊,有可能服务端看接收到的不是以规定的字节开头的抛弃了没有处理。 第二,你们传的字符串转成字节数组是约定的用UTF-8编码吗? 第三,涉及到自己构造协议,已经不是基本数据类型了,不要用DataInputStream和DataOutputStream。 当然以上只是一些建议,你试试吧,不一定对。
谢谢建议。 第一第二个我能理解 但是第三个如果不用DataInputStream,那还能用什么呢?

80,490

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧