Socket与连接池
 刚学了Socket编程,想拓展一下.与连接池一起用.增加其可用性.

自己写了下,运行没得到想要的结果.不知道错在哪里,所以只能请各位帮忙了.

Server端:
package pool;

import java.net.ServerSocket;
import java.net.Socket;

public class Server implements Runnable{
protected static int maxLeng;
private static int port;
private static ServerSocket server;

public Server() {
}
public Server(int port,int maxLength){
    this.port=port;
    this.maxLeng=maxLength;
}

public void run(){
    try {
        server=new ServerSocket(port,maxLeng);//创建一个最大链接次数为5次的ServerSocket.
        Socket socket=server.accept();
        pool.addSocket(socket);

    } catch (Exception e) {
        e.printStackTrace();
    }
}


public static void main(String[] args) {
    Server server=new Server(9090,5);
    server.run();
}

}

pool and cilent:
package pool;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.LinkedList;
import java.util.List;

public class pool implements Runnable{
private static List poolList=new LinkedList();
private Socket socket;
private String ip;
private int port;
public pool() {
// TODO Auto-generated constructor stub
}
public pool(String ip,int port){
this.ip=ip;
this.port=port;
}

public static void addSocket(Socket socket){
    synchronized (poolList) {//将连接池同步起来
        poolList.add(poolList.size(),socket);
        poolList.notifyAll();
    }
}

public void make(){
    try {
        socket=new Socket(ip,port);
        File file=new File("e:\\我的工号.txt");
        BufferedReader read=new BufferedReader(new InputStreamReader(new FileInputStream(file)));
        String tempStr="";
        String temp=null;
        PrintWriter pw=new PrintWriter(socket.getOutputStream());
        while((temp=read.readLine())!=null){
            tempStr+=(temp+"\r");
        }
        pw.write(tempStr);
        pw.close();
        read.close();
    } catch (Exception e) {
        e.printStackTrace();
    } 
}
public void run() {
    while(true){
        synchronized (poolList) {
            while(poolList.isEmpty()){
                try {
                    poolList.wait();
                } catch (InterruptedException e) {
                    return;
                }
            }
            Socket socket=(Socket)poolList.remove(0);               
        }
        make();
    }
}

public static void main(String[] args) {
    add();
}
public static void add(){
    for(int i=0;i<Server.maxLeng;i++){
        pool p=new pool("10.43.9.51",9090);
        new Thread(p,i+"").start();
    }
}

}
本来是希望通过Socket多线程的读文件.现在运行出现的结果没有报错.也没有任何内容输出.(注:操作步骤没有问题的.)

30个回答

[quote]还有个地方。 socket=(Socket)list.remove(0);这句话是什么意思。看上去很诡异,不是删除掉list中的第一个值么,为什么还有返回值呢.哦..是不是说进入同步的这个线程要占用这个链接资源,所以要将该资源从list里面去掉啊. [/quote]
对 这个方法就是从列表删除了第一个对象,并且把这个对象返回出去。

删除的意思就是 想从连接池中去掉这个,标识已经被占用了。

欢迎采纳! 不懂的可以站内问我。

[quote]pool.addSocket(socket);[/quote]
服务器在监听了,但是你有客户端往服务端发送连接请求么?

那你的 make() 在什么情况才会调用到呢?是在你 pool 类的run方法的最后面,但你的这个 run() 方法什么时候可以走到调用 make() 的这段代码呢?走不到。

[code="java"]public static void main(String[] args) {
Server server=new Server(9090,5);
server.run();
}
} [/code]这段代码有问题,你应该这样做:

[code="java"]public static void main(String[] args) {
Server server=new Server(9090,5);
Thread threadServer=new Thread(server);
threadServer.start();
}
}[/code]
而不是直接调用run方法。

socket 编程真是一个好东西了。来学习下。

[code="java"]synchronized (poolList) {
while(poolList.isEmpty()){
try {
poolList.wait();
} catch (InterruptedException e) {
return;
} [/code]
这段话,当线程进入之后,假如遇到empty的时候这个线程wait,等于是这个线程等待在这里,然后让别的线程进入,但是假如别的线程也等着了,那么没有唤醒程序了,所以互相锁住就死锁啦。

[quote]为什么会走不到make()方法呢.哪里有问题么 [/quote]
因为你在调用 make() 之前,有这么一段
[code="java"]
synchronized (poolList) {
while(poolList.isEmpty()){
try {
poolList.wait();
} catch (InterruptedException e) {
return;
}
}
Socket socket=(Socket)poolList.remove(0);
}
[/code]
首先,其中的 [code="java"]poolList.wait();[/code]
它会被执行,然后就一直阻塞在这个地方,而后,你的服务端一直在等待一个客户端来与它进行连接(因为 accept() 是阻塞的),这样的话,服务端无法与任何一个客户端进行连接,也就无法执行[code="java"]pool.addSocket(socket); [/code],这样就相当陷入一个死循环:服务在等客户端进行连接,而且客户端在等服务端产生的 socket。

while换成if
然后后面加一个else{
this.notifyAll();
}
试试。

建议分成三个部份来写:
① 服务端
② 客户端
③ 连接池

你这个整体得改啊 从哪里说哦

共30条数据 1 3 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐