//服务端主类
import java.io.*;
import java.net.*;
import java.util.*;public class PooledRemoteFileServer {
protected int maxConnections;
protected int listenPort;
protected ServerSocket serverSocket;
public PooledRemoteFileServer(int aListenPort, int maxConnections) {
//设定端口号和最大连接数
listenPort = aListenPort;
this.maxConnections = maxConnections;
} //创建一个能够处理待发请求的ServerSocket,并使其接受连接
public void acceptConnections() {
try {
//ServerSocket(端口,待发数)
//实际存储数:待发数+处理数
ServerSocket server = new ServerSocket(listenPort, 5);
Socket incomingConnection = null;
while (true) {
incomingConnection = server.accept();
//System.out.println(incomingConnection);
handleConnection(incomingConnection);
}
}
catch (Exception e) {
e.printStackTrace();
}
} //将连接传入processRequest中进行处理
protected void handleConnection(Socket connectionToHandle) {
//System.out.println("*0" + connectionToHandle);
PooledConnectionHandler.processRequest(connectionToHandle);
} //创建N个PooledConnectionHandler并在新Thread中激活
public void setUpHandlers() {
for (int i = 0; i < maxConnections; i++) {
PooledConnectionHandler currentHandler = new PooledConnectionHandler();
new Thread(currentHandler, "Handler " + i).start();
}
} //一旦有连接,立即进行处理
public static void main(String args[]) {
PooledRemoteFileServer server = new PooledRemoteFileServer(8083, 10);
server.setUpHandlers();
server.acceptConnections();
}
}//====================================================//Runnable类
import java.io.*;
import java.net.*;
import java.util.*;public class PooledConnectionHandler
implements Runnable {
protected Socket connection;
protected static List pool = new LinkedList(); public PooledConnectionHandler() {} public void handleConnection() {
Random random = new Random();
int x = random.nextInt(5000);
try {
//System.out.println("*2" + connection);
BufferedReader is = new BufferedReader(new
InputStreamReader(connection.
getInputStream()));
//System.out.println("*3" + connection);
//System.out.println("***");
String line = is.readLine().toString();//到这一步就不能执行了
//System.out.println("接收信息:" + line + "\n");
try {
Thread.sleep(x);
}
catch (Exception ex) {
ex.printStackTrace();
}
PrintWriter os = new PrintWriter(connection.getOutputStream());
os.println(line);
os.flush();
System.out.println("发送信息" + line + "\n");
os.close();
is.close();
//connection.close();
}
catch (Exception e) {
e.printStackTrace();
}
} /**
* 把传入请求添加到池中,并告诉其它正在等待的对象该池已经有一些内容
* pool是一个 LinkedList,保存等待处理的连接池
* 确保不能同时修改连接池
* */
public static void processRequest(Socket requestToHandle) {
synchronized (pool) {
pool.add(pool.size(), requestToHandle);
pool.notifyAll(); //通知连接池可用,连接池启动
}
} public void run() {
while (true) {
synchronized (pool) {
while (pool.isEmpty()) {
try {
pool.wait(); //修改连接池状态为等待
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
connection = (Socket) pool.remove(0);
//System.out.println("*1" + connection);
}
handleConnection(); //一旦有一个连接可以使用,便机型处理
}
}
}
//=======================================================//客户端测试类
import java.io.*;
import java.net.*;
import java.util.*;public class test {
public test() { } public static void main(String[] args) {
test t = new test();
String line = "111";
String rec;
try {
Socket s = new Socket("192.168.0.1", 8083);
PrintWriter pw = new PrintWriter(s.getOutputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(
s.getInputStream()));
//for (; ; ) {
pw.print(line);
pw.flush();
System.out.print("发送:" + line + "\n");
rec = br.readLine().toString();
System.out.println("接收:" + rec + "\n");
br.close();
pw.close();
s.close();
//}
}
catch (Exception e) {
e.printStackTrace();
}
}
}//============================
请教:
为什么到Runnable类的String line = is.readLine().toString();就执行不了了,也就是说line无法赋值?
关闭客户端测试后,服务端报错:
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at sun.nio.cs.StreamDecoder$CharsetSD.readBytes(StreamDecoder.java:411)
at sun.nio.cs.StreamDecoder$CharsetSD.implRead(StreamDecoder.java:453)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:183)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at socketpool.PooledConnectionHandler.handleConnection(PooledConnectionHandler.java:29)
at socketpool.PooledConnectionHandler.run(PooledConnectionHandler.java:76)
at java.lang.Thread.run(Thread.java:595)请各位大侠赐教!!!谢谢啦...
楼主【jayray007】截止到2008-07-18 11:25:24的历史汇总数据(不包括此帖):
发帖的总数量:6 发帖的总分数:307 每贴平均分数:51
回帖的总数量:20 得分贴总数量:8 回帖的得分率:40%
结贴的总数量:6 结贴的总分数:307
无满意结贴数:0 无满意结贴分:0
未结的帖子数:0 未结的总分数:0
结贴的百分比:100.00% 结分的百分比:100.00%
无满意结贴率:0.00 % 无满意结分率:0.00 %
敬礼!
估计客户端没有发送消息
System.out.println("接收信息:" + line + "\n");
什么都没打印出来3楼:
客户端确定发送了信息
Runnable类中的//System.out.println("***")就是为了测试socket的情况
BufferedReader is = new BufferedReader(new
InputStreamReader(connection.
getInputStream()));
这个方法也执行了
在readline()加一个toString()是没影响的
这个需要放到run里面读的吧
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class Test { //public Test() {} //测试类没必要加 public static void main(String[] args) {
//Test t = new Test(); //同样必要
String line = "111";
String rec;
try {
Socket s = new Socket("192.168.0.100", 8083);
PrintWriter pw = new PrintWriter(s.getOutputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
//for (; ; ) {
pw.print(line);
pw.flush();
System.out.print("发送:" + line + "\n");
//发完数据要关闭输出浏以告诉服务器端我所有数据都发完了,否则服务器端 readLine() 方法会一直被阻塞
s.shutdownOutput();
rec = br.readLine()/*.toString()*/;
System.out.println("接收:" + rec + "\n");
br.close();
pw.close();
s.close();
//}
} catch (Exception e) {
e.printStackTrace();
}
}}