在public class Listener extends Thread {...} 中1>生成ServerSocket侦听对象
ServerSocket listener = new ServerSocket(this.port,maxConn);2> 侦听线程运行函数 (线程优先级为7)
public void run() { while(!stop_flag) {
try {
client = listener.accept(); System.out.println(this.service); addConnection(client,runService); } catch (Exception e) {
e.printStackTrace();
Date today = new Date();
System.out.println(today);
}
}
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}3>收到连接后唤醒工作线程队列
synchronized (pools) {
pools.add(pools.size(), socket);
pools.notify();
}
4>工作线程工作(线程优先级为5)public void run() {
while (true) {
synchronized (pools) {
while (pools.isEmpty()) {
try {
pools.wait();
} catch (InterruptedException e) {
log.println(e.getMessage());
}
} //获得第一个有效的Socket连接
socket = (Socket) pools.remove(0);
//加入服务连接
server.addConnections(socket);
//当前连接数增加
checkOut++;
}
synchronized (this) {
handleConnection(socket, s);
}
}
}5>具体工作函数 public void handleConnection(Socket socket, Service s) {
try {
socket.setSoTimeout(20000); InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream(); //调用相应的应用服务
//读取数据,进行处理,并输出数据.最后 in.close ; out.close;
s.serve(in, out); } catch (IOException e) {
e.printStackTrace();
Date today = new Date();
System.out.println(today + " --- handleConnection");
} //取消服务中的socket连接,并且关闭soclet
server.removeConnections(socket);
//当前连接数减少
checkOut--;
}
}
出现奇怪现象: StringBuffer buf = new StringBuffer(); try {
//连接能够成功
socket = new Socket("服务器的IP", iport); //in,out也能正常获得
in = socket.getInputStream();
out = new PrintWriter(socket.getOutputStream(), true);
long timeStart = System.currentTimeMillis();
//数据输出也正确
out.print(ls_message);
out.flush(); String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
//出现错误,客户端就停在这了
line = reader.readLine(); // 读取第一行 out.close();
in.close(); socket.close(); } catch (IOException e)
{
e.printStackTrace();
} 侦听线程:public void run() { while(!stop_flag) {
try {
System.out.println("begin###########################");
//客户端连接正常,但是线程就停在这不往下运行了
client = listener.accept();
//不打印提示信息
System.out.println(this.service); addConnection(client,runService); } catch (Exception e) {
e.printStackTrace();
Date today = new Date();
System.out.println(today);
}
}请大家指点一下!!!
ServerSocket listener = new ServerSocket(this.port,maxConn);2> 侦听线程运行函数 (线程优先级为7)
public void run() { while(!stop_flag) {
try {
client = listener.accept(); System.out.println(this.service); addConnection(client,runService); } catch (Exception e) {
e.printStackTrace();
Date today = new Date();
System.out.println(today);
}
}
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}3>收到连接后唤醒工作线程队列
synchronized (pools) {
pools.add(pools.size(), socket);
pools.notify();
}
4>工作线程工作(线程优先级为5)public void run() {
while (true) {
synchronized (pools) {
while (pools.isEmpty()) {
try {
pools.wait();
} catch (InterruptedException e) {
log.println(e.getMessage());
}
} //获得第一个有效的Socket连接
socket = (Socket) pools.remove(0);
//加入服务连接
server.addConnections(socket);
//当前连接数增加
checkOut++;
}
synchronized (this) {
handleConnection(socket, s);
}
}
}5>具体工作函数 public void handleConnection(Socket socket, Service s) {
try {
socket.setSoTimeout(20000); InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream(); //调用相应的应用服务
//读取数据,进行处理,并输出数据.最后 in.close ; out.close;
s.serve(in, out); } catch (IOException e) {
e.printStackTrace();
Date today = new Date();
System.out.println(today + " --- handleConnection");
} //取消服务中的socket连接,并且关闭soclet
server.removeConnections(socket);
//当前连接数减少
checkOut--;
}
}
出现奇怪现象: StringBuffer buf = new StringBuffer(); try {
//连接能够成功
socket = new Socket("服务器的IP", iport); //in,out也能正常获得
in = socket.getInputStream();
out = new PrintWriter(socket.getOutputStream(), true);
long timeStart = System.currentTimeMillis();
//数据输出也正确
out.print(ls_message);
out.flush(); String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
//出现错误,客户端就停在这了
line = reader.readLine(); // 读取第一行 out.close();
in.close(); socket.close(); } catch (IOException e)
{
e.printStackTrace();
} 侦听线程:public void run() { while(!stop_flag) {
try {
System.out.println("begin###########################");
//客户端连接正常,但是线程就停在这不往下运行了
client = listener.accept();
//不打印提示信息
System.out.println(this.service); addConnection(client,runService); } catch (Exception e) {
e.printStackTrace();
Date today = new Date();
System.out.println(today);
}
}请大家指点一下!!!
is 是个什么东东,应该是in 吧
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
上面这一段是在一个其他函数里的in作为参数传给is的
〉既然线程是停在那里了,那么说明程序就没有收到任何连接,它一直在监听通讯。
> 检查一下服务器的确输出了吗?问题是我的客户端代码:
socket = new Socket("服务器的IP", iport);
//in,out也能正常获得
in = socket.getInputStream();
out = new PrintWriter(socket.getOutputStream(), true);
long timeStart = System.currentTimeMillis();
//数据输出也正确
out.print(ls_message);
out.flush();
String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
//出现错误,客户端就停在这了
line = reader.readLine()但是服务器却没有反应。如果连不上的话,客户端应该不能网下运行,应该出错呀!正常应该一运行:socket = new Socket("服务器的IP", iport); 服务器就应该响应呀!
private synchronized void addConnection(Socket s, Service service) {
ConnectionHandler.requestToHandler(s, service);
}//ConnectionHandler类
import java.io.*;
import java.net.*;
import java.util.*;public class ConnectionHandler implements Runnable { private Socket socket; //当前的socket对象
private static List pools = new LinkedList(); //连接服务列表
private PrintWriter log = new PrintWriter(System.err, true); //显示提示信息对象
private static int checkOut = 0; //当前连接数
private static Service s; //应用服务
private Server server; //连接所在的服务
private static boolean stop_flag = false; //是否停止标志 public ConnectionHandler(Server server) {
this.server = server;
} public void run() {
while (true) {
synchronized (pools) {
while (pools.isEmpty()) {
try {
pools.wait();
// log.println("线程" + Thread.currentThread().getName() + "接收连接......");
} catch (InterruptedException e) {
log.println(e.getMessage());
}
} //获得第一个有效的Socket连接
socket = (Socket) pools.remove(0);
//加入服务连接
server.addConnections(socket);
//当前连接数增加
checkOut++;
}
synchronized (this) {
handleConnection(socket, s);
}
}
} public static void requestToHandler(Socket socket, Service service) {
s = service;
// System.out.println("####################");
// System.out.println("请求连接");
synchronized (pools) {
pools.add(pools.size(), socket);
pools.notifyAll();
}
} public static int getCurrentConnections() {
return checkOut;
} public void handleConnection(Socket socket, Service s) {
try {
String ip; socket.setSoTimeout(10000); //获得输入输出对象
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
//调用相应的应用服务
s.serve(in, out); System.out.println("**********************************"); } catch (IOException e) {
e.printStackTrace();
Date today = new Date();
System.out.println(today + " --- handleConnection");
} //取消服务中的socket连接
server.removeConnections(socket);
//当前连接数减少
checkOut--;
}
}
synchronized (this) {
handleConnection(socket, s);
}
line = reader.readLine()
====================
是很正常的现象,因为reader试图readLine()
但是由于流中没有内容,所以IO就会阻塞在这里,
出现这种情况的原因就是服务器没有响应客户端的请求(或者是没有收到请求)。
下面的代码不自再运行,正常情况下客户端运行socket = new Socket("服务器的IP", iport);服务段就会运行下面的代码。
System.out.println(this.service);
addConnection(client,runService);同时服务程序停在了
client = listener.accept();
有兴趣一边上网一边赚钱吗?,赚的还是美元呢。
您想轻松做兼职,超过自己的薪水!!
这绝对是真实的,cctv-10都报道了它的可信性!
特别是上班时能上网的朋友,只要能上网就能赚钱,不用你费心
详情请登陆http://freemoneycn.home4u.china.com/
立即注册http://www.cashfiesta.com/php/join.php?ref=freemoneynj