socke循环获取数据的疑惑

原创 2017年01月02日 22:42:52
在一个系统当中其服务端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();
                                    }

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

相关文章推荐

myeclipse mysql servlet从前端获取数据

  • 2017年09月08日 12:57
  • 1.65MB
  • 下载

节约资源 单次获取数据进行显示

  • 2017年01月20日 17:01
  • 1.47MB
  • 下载

Bootstrap 分页插件 ajax获取数据显示

bootstrap-paginator

SpringMvc获取数据的方式

  • 2017年07月21日 15:37
  • 472KB
  • 下载

ECharts饼图从后台动态获取数据并展示

$.post( url, {'id' : gridStationSeq  }, function(result) { console.log("接收返回值="+result) if (result !...

highChart后台动态获取数据

  • 2015年12月07日 10:16
  • 641KB
  • 下载

echart后台获取数据实例

  • 2016年04月11日 15:32
  • 253KB
  • 下载

JAVA连接Mysql数据库,获取数据

package NEW; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedSta...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:socke循环获取数据的疑惑
举报原因:
原因补充:

(最多只允许输入30个字)