Socket通信使用readLine()方法接收服务器数据之坑

搭建Android客户端与服务器之间进行数据交互,实现简单的用户登录时,通过Socket建立连接后,将用户登录信息通过Message对象进行传输:

public void handleMessage(Message msg) {
    //接收到UI线程中用户输入的数据
    if(msg.what == 0x456){
        //将用户在文本框内输入的内容写入网络
        try{
            os.write((msg.obj.toString() + "\r\n").getBytes("utf-8"));
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}

因为刚接触Socket传输,这段代码是借鉴的资料上的,所以对os.write((msg.obj.toString() + "\r\n").getBytes("utf-8"));中的“/r/n"没太在意,只是一个换行符而已,然而这却是一个我始料不及的大坑啊!!!

在编写服务器代码时,对客户端接收的数据进行相应的数据库表查询后,将登录结果通过Socket返回到客户端,代码如下:

while((content = readFromClient()) != null){
                String[] logininfo = content.split("&");
                //获取客户端的登录信息
                String username = logininfo[0];
                String password = logininfo[1];
                //建立用户信息查询
                String loginSql = "select * from users where username = ? and password = ?";
                Connection connection = DBConnection.getConnection();
                PreparedStatement pStatement = connection.prepareStatement(loginSql);
                pStatement.setString(1, username);
                pStatement.setString(2, password);
                ResultSet resultSet = pStatement.executeQuery();
                //返回查询结果,判断登录结果
                OutputStream oStream = socket.getOutputStream();
                if(resultSet.next()){
                    oStream.write(("successful").getBytes("utf-8"));
                    System.out.println("成功");
                } else {
                    oStream.write(("fail"+ "\r\n").getBytes("utf-8"));
                    System.out.println("失败");
                }
            }

到这里,程序运行到这里也是没有任何问题的,但当数据回到客户端后,在客户端接收服务器返回的数据时:

while((content = br.readLine()) != null){
    //将服务器返回的登录信息发送给登录handler处理
    Message message = new Message();
    message.what = 0x123;
    message.obj = content;
    handler.sendMessage(message);
}

使用的readLine()方法,在读取到有数据存在时,该方法会在遇到明确的换行符(‘/r' , '/n')时才结束!!!而我在编写服务器返回登录结果时,oStream.write(("successful").getBytes("utf-8"));忘记添加“/r/n"了,导致我客户端一直没有显示登录成功或失败。。。

    

虽然成功返回登录信息正确的标识”successful",但是readLIne()方法没有遇到换行符('/r','/n','/r/n'),所以:

通过debug的方式才发现是readLine()方法一直在获取服务器端发送回来的”正行“数据,所以程序一直卡着不动!!!

以后用readLine()方法进行读取时,一定记得添加换行符('/r','/n','/r/n')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值