weixin_42472582 2011-08-30 05:42
浏览 598
已采纳

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条回答 默认 最新

  • AngelAndAngel 2011-08-30 09:23
    关注

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

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(29条)
编辑
预览

报告相同问题?

悬赏问题

  • ¥15 基于pwm 实现buck变换
  • ¥15 关于#c##的问题:treenode反序列化后获取不到上一节点和下一节点,Fullpath和Handle报错
  • ¥15 一部手机能否同时用不同的app进入不同的直播间?
  • ¥15 没输出运行不了什么问题
  • ¥20 输入import torch显示Intel MKL FATAL ERROR,系统驱动1%,: Cannot load mkl_intel_thread.dll.
  • ¥15 点云密度大则包围盒小
  • ¥15 nginx使用nfs进行服务器的数据共享
  • ¥15 C#i编程中so-ir-192编码的字符集转码UTF8问题
  • ¥15 51嵌入式入门按键小项目
  • ¥30 海外项目,如何降低Google Map接口费用?