62,614
社区成员
发帖
与我相关
我的任务
分享
//服务端主类
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();
}
}
}
//============================
//客户端测试类
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();
}
}
}