关闭

socke循环获取数据的疑惑

50人阅读 评论(0) 收藏 举报
在一个系统当中其服务端Socket的代码为:

while (mIsRun) {
try {
// 当有客户端连接上时,创建客户端
final Socket socket = mSever.accept();
new Thread(new Runnable() {
public void run() {
BufferedReader in;
try {
in = new BufferedReader(new InputStreamReader(
socket.getInputStream(), "UTF-8"));
PrintWriter out = new PrintWriter(socket
.getOutputStream());

while (!socket.isClosed()) {
// 读取客户端发送的内容
String receiveStr;
receiveStr = in.readLine();
if (receiveStr == null)
break;
if (receiveStr != null
&& !receiveStr.equals("")) {
if (receiveStr.equals("getNotification")) {
Log.i("Notifacation", "getNotification");

String socketResp = "";
String notifiMsg = "";
if (isCanStartNoitifiServer()) {
checkAllSensorStatus();
notifiMsg = getNotificationMsg();
}
JSONObject jsonResponse = new JSONObject();
try {
jsonResponse.put("notifiId",
mNotifiId);
jsonResponse.put("notifiMsg",
notifiMsg);
socketResp = jsonResponse
.toString();
} catch (JSONException e) {
e.printStackTrace();
}
out.println(Base64.encodeToString(
socketResp.getBytes(),
Base64.DEFAULT));
}
out.flush();
}
}
// 主动关闭socket连接
socket.close();

} catch (IOException e) {
e.printStackTrace();
}
}
}).start();// 开始启动线程

} catch (IOException e) {
e.printStackTrace();
}
}


固然客户端我是这样写的:

                                    // 1.建立客户端socket连接,指定服务器位置及端口
Socket socket = new Socket("192.168.253.2", 8892);
// 2.得到socket读写流
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
// 输入流
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(
new InputStreamReader(is));
// 3.利用流按照一定的操作,对socket进行读写操作
String info = "getNotification";
pw.write(info);
pw.flush();
socket.shutdownOutput();
// 接收服务器的相应
String reply = null;
if (!((reply = br.readLine()) == null)) {
Log.i("Notification", reply);
}
 // 4.关闭资源
br.close();
is.close();
pw.close();
os.close();
//socket.close();

                                     <!--客户端是可以正常获取一次数据的,Base64没做解码-->
问题来了,服务端的while (!socket.isClosed())不就的判断长连接吗? 既然如此我应该在客户端怎么达到循环的请求和接受呢?
或许我对服务器的写法存在误解呢?

如果我改写客户端为:

     // 1.建立客户端socket连接,指定服务器位置及端口
Socket socket = new Socket("192.168.253.2", 8892);
// 2.得到socket读写流
                                        while(true){
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
// 输入流
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(
new InputStreamReader(is));
// 3.利用流按照一定的操作,对socket进行读写操作
String info = "getNotification";
pw.write(info);
pw.flush();
socket.shutdownOutput();
// 接收服务器的相应
String reply = null;
if (!((reply = br.readLine()) == null)) {
Log.i("Notification", reply);
}
 // 4.关闭资源
br.close();
is.close();
pw.close();
os.close();
                                    }

在输出和输入流添加一个死循环能得到一次数据但死循环是无效的。。。。。。。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1200次
    • 积分:136
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档