为了账号安全,请及时绑定邮箱和手机立即绑定

关于2.3节多客户端重连的问题

@郭霖,多客户端连入那一节reader和writer设置成全局怎么感觉好怪异。比如A客户端连接,服务器拿到A的Socket对象,然后创建了reader和writer对象保持和A客户端的通信。这个时候B客户端接入,服务器拿到B的Socket对象,然后创建reader和writer对象,这个时候全局的reader和writer指向了B客户端所对应的Socket,那服务器这个时候应该失去和A客户端的通信功能了呀,怎么你的还可以通信呢,求解答,谢谢。

正在回答

4 回答

知道问题了你写错了

spd10000paimkzitqgivqehzkeya

0 回复 有任何疑惑可以回复我~

reader writer 设置为 类变量 然后开启多个线程 会有线程安全问题吧

0 回复 有任何疑惑可以回复我~

老师的代码是有问题的,错误在 

不该把 BufferedReader bufferedReader;BufferedWriter bufferedWriter; 设置为全局。

否则会造成 后面接入的客户端 的BufferedReader BufferedWriter 会替换掉前面的。也就是只能最后一个客户端是可以通信的。  

老师的代码:B客户端接入时,会替换A客户端的 BufferedReader BufferedWriter  仅仅只能通信一次(这个原因还有待研究,被B客户端替换后理应一次都不能通信)。


下面是我纠正后的测试代码(通过BufferedReader BufferedWriter的hashCode可以看出已经替换替换了): 

package com.jo.server;


import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.ServerSocket;

import java.net.Socket;


public class SocketServer {

BufferedReader bufferedReader = null;

public static void main(String[] args) {

SocketServer socketserver = new SocketServer();

socketserver.startServer();

}

public void startServer(){

ServerSocket serverSocket = null;

Socket socket = null;

try {

serverSocket = new ServerSocket(9988);

System.out.println("------------等待客户端的连接--------------");

//等待客户端的连接、处于阻塞状态

while(true){

socket = serverSocket.accept();

manageConnection(socket);

}

} catch (IOException e) {

e.printStackTrace();

} finally{

try {

if(socket != null)

socket.close();

if(serverSocket != null)

serverSocket.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

public void manageConnection(final Socket socket){

new Thread(new Runnable() {

@Override

public void run() {

BufferedReader bufferedReader = null;

BufferedWriter bufferedWriter = null;

try {

System.out.println("------------client--------------" + socket.hashCode() + "connedted");

bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

// bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

String clientMsg;

while((clientMsg = bufferedReader.readLine()) != null){//readLine() 如果没有信息,会处于阻塞状态

System.out.println("bufferedReader.hashCode()" + bufferedReader.hashCode() +

"====socket.hashCode():" + socket.hashCode()+ 

"====clientMsg:" + clientMsg);

bufferedWriter.write("server reply:" + clientMsg + "\n");

bufferedWriter.flush();

}

} catch (IOException e) {

e.printStackTrace();

}finally{

try {

if(bufferedWriter != null)

bufferedWriter.close();

if(bufferedReader != null)

bufferedReader.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}).start();

}

}






0 回复 有任何疑惑可以回复我~
#1

Episode

你的这个代码问题也大啊,bufferedWriter全局变量不声明,finally里关闭时会报错,而且前面将bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));注释掉后面咋个用?
2015-09-01 回复 有任何疑惑可以回复我~

我也刚刚看到这个视频,这段服务器端的代码我也觉得很神奇啊,b客户端接入,感觉reader,write都变成b的了,回不去a了,为什么a的客户端还能通过reader writer跟服务器通信

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
见证Android消息推送时刻
  • 参与学习       48201    人
  • 解答问题       203    个

本课程将一步步教你如何搭建出一个自己的Android推送平台

进入课程

关于2.3节多客户端重连的问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信