|
手机端的代码我已经写了,也找别人帮忙测试过,没问题,但是我的服务端用了线程池来做,因为怕并发量大的情况,下面直接贴服务端代码了: 第一个类:MessageListener
// 保留线程池的大小
int corePoolSize = 1000;
int maxPoolSize = 2000;
BlockingQueue queue = new LinkedBlockingDeque();
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize,
maxPoolSize, 1, TimeUnit.DAYS, queue);
try {
// 监听9420端口
serverSocket = new ServerSocket(9420);
while (true) {
// 监听消息
Socket socket = serverSocket.accept();
System.out.println("进来了...");
while (true) {
//启动一个任务
executor .execute(new MessageOptThread(socket));
break;
}
下面是第二个类:MessageOptThread
public class MessageOptThread implements Runnable {
private static String encoding = "UTF-8";
private Socket socket = null;
/**
* 构造有socket对象的对象
*
* @param socket
*/
public MessageOptThread(Socket socket) {
// TODO Auto-generated constructor stub
this.socket = socket;
try {
// 保持长连接
socket.setKeepAlive(true);
} catch (Exception e) {
// TODO: handle exception
}
run();
}
public void run() {
// TODO Auto-generated method stub
try {
System.out.println("发送消息的地址" + socket.getInetAddress() + ":" + socket.getPort());
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream(), encoding));
String info = reader.readLine();
System.out.println(info);
} catch (Exception e) {
e.printStackTrace();
}
}
}
现在的情况是,如果在第二个类里面的try的代码加上while(true)去包含整个try的代码,就可以接受到一个手机,多次发送到服务端的消息,但是其他手机就不能发送消息到服务端了,因为while这个死循环会阻塞着,不能跳出去,访问第一个类的Socket socket = serverSocket.accept(); 代码。如果这个try里面不加while这个死循环,那么手机只能发一次消息,第二次就不能发了,但是其他手机可以发消息给服务端,但是也只能访问一次,第二次就不能发了,因为我调试发现 如果不加循环,那么第一次执行到输出的时候,又会再执行一次 String info = reader.readLine();到这一句,去阻塞着,现在不知道怎么解决这个问题?只要能监听多个手机的发送消息就可以了,求解啊..... |
|