搭建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')