【问题标题】:Socket Programming in Java to send and receive byte arrayJava中的Socket编程发送和接收字节数组
【发布时间】:2016-04-08 22:16:13
【问题描述】:

我是 android 新手,我遇到了套接字编程问题。

class ClientAsycTask extends AsyncTask<String,Void,String>{
    ProgressDialog progress;
    @Override
    protected void onPreExecute() {
        progress = new ProgressDialog(MainActivity.this);
        progress.setMessage("Connection Server Please wait");
        progress.setIndeterminate(true);
        progress.show();
    }

    @Override
    protected String doInBackground(String... params) {
        String result = null;
        Socket socket = new Socket();
        String host = "systemteq.gotdns.com";
        Integer port = 4999;
        DataOutputStream s_out = null;
        BufferedReader s_in = null;
        try{
            socket.connect(new InetSocketAddress(host, port));
            s_out = new DataOutputStream( socket.getOutputStream());
            s_in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            byte[] messages = new byte[]{0x10,0x01,0x03,0x00,0x00};
            s_out.write(messages);
            String response;
            while((response = s_in.readLine())!=null){
                result += response;
            }
            //result = "Successfully"+s_in.read();//s_in.readLine();
            socket.close();

        }catch (Exception e){
            Toast.makeText(MainActivity.this,"systemteq.gotdns.com:4999 not connected",Toast.LENGTH_SHORT).show();
        }
        return result;
    }

    @Override
    protected void onPostExecute(String s) {
        if(progress.isShowing()){
            progress.dismiss();
        }
        Toast.makeText(MainActivity.this,"Connected "+s,Toast.LENGTH_SHORT).show();
        tv.setText(s);
    }
}

上面的代码向服务器发送一个十六进制代码,服务器用一些十六进制代码进行响应,比如 10 01 20 10 00.[五个字节]。

但是当我在上面运行时,代码进度对话框永远不会关闭。解决后我发现 s_in.readLine() 从服务器读取响应时出现问题。

我浏览了很多链接,但在解决这个问题时我没有成功。请帮我解决这个问题。

更新:-

使用DataInputStream后:-

s_in = new DataInputStream(socket.getInputStream());
            byte[] messages = new byte[]{0x10,0x01,0x03,0x00,0x00};
            s_out.write(messages);
            String response;
            System.out.println("START");
            result = s_in.readUTF();

它仍然不需要响应字节。虽然请求成功。

更新 2

byte m = s_in.readByte();
result = Byte.toString(m);

现在我得到字节值,但我应该得到 5 个字节,而不是得到 5 个字节,我只得到一个。请帮我解决这个问题

【问题讨论】:

    标签: java android sockets tcpclient


    【解决方案1】:

    如果您正在等待二进制数据,请不要使用InputStreamReader,而是尝试使用DataInputStream。
    readLine() 等待“\n”、“\r”、“\r\n”或阅读器结束。

    更新:如果您知道确切的字节数,请将它们读入数组。

    byte[] buf = new byte[5];
    s_in.read(buf);
    

    【讨论】:

    • 如果服务器向您发送字节,为什么您总是尝试将它们读取为字符串?将字节读取到 byte[] 缓冲区。这很容易。字符串更复杂。
    • Hai @Eugene Krivenja 谢谢,现在工作正常,但现在一次只占用一个字节。据我所知,它将返回 5 个字节。你有什么想法
    • @RKD 不,readUTF() 与readLine() 做的事情不同,最粗略的看一下文档就会发现。
    • hi @EJP thanx ,实际上我使用 readByte 时的响应是 24,当我将其转换为十六进制时它是 18,这是响应的第一个字节。响应是 18 06 05 00 00。你能告诉我我怎样才能拿到所有这些字节
    猜你喜欢
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2010-11-13
    相关资源
    最近更新 更多