关于socket(连接池)的一个问题(急,在先等,谢谢)

jayray007 2008-07-18 11:25:13

//服务端主类
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)

请各位大侠赐教!!!谢谢啦...
...全文
187 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sagezk 2008-07-18
  • 打赏
  • 举报
回复
//客户端测试类
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();
}
}

}
冰思雨 2008-07-18
  • 打赏
  • 举报
回复
郁闷,你接收端用的是readLine方法.可是发送端,发送的信息,却不是一行字符串,也就是说,没有换行符,让人家接收端怎么读一行啊 ?

你把那个pw.print(line);改成println(line);就OK了.

jayray007 2008-07-18
  • 打赏
  • 举报
回复
有帮忙调试一下
加分
jayray007 2008-07-18
  • 打赏
  • 举报
回复
是run中调用啊
laorer 2008-07-18
  • 打赏
  • 举报
回复
String line = is.readLine().toString();//到这一步就不能执行了
这个需要放到run里面读的吧
jayray007 2008-07-18
  • 打赏
  • 举报
回复
1楼:
在readline()加一个toString()是没影响的
jayray007 2008-07-18
  • 打赏
  • 举报
回复
4楼:
System.out.println("接收信息:" + line + "\n");
什么都没打印出来

3楼:
客户端确定发送了信息
Runnable类中的//System.out.println("***")就是为了测试socket的情况
BufferedReader is = new BufferedReader(new
InputStreamReader(connection.
getInputStream()));
这个方法也执行了
jingulang 2008-07-18
  • 打赏
  • 举报
回复
//System.out.println("接收信息:" + line + "\n");

你这句打印出什么?
laorer 2008-07-18
  • 打赏
  • 举报
回复
为什么到Runnable类的String line = is.readLine().toString();就执行不了了,也就是说line无法赋值?
估计客户端没有发送消息
jingulang 2008-07-18
  • 打赏
  • 举报
回复
没看懂 is.readLine()返回的就是一个String 你为什么还要toString()

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧