线程池实现socket 通信问题,不能长时间运行。

1.创建一个监听

[code="java"]import java.io.IOException;
import java.net.*;
import java.util.concurrent.Future;

public class Listener extends ServerSocket implements Runnable {

public Listener() throws IOException {
    super(Server.AppConfig.getLocalhost().getListenport());
}

@Override
public void run() {
    while (true) {
        try {
            Socket socket = accept();
            CreateServer server = new CreateServer(socket, Server.pool);
            Future<Integer> result = Server.pool.submit(server);                
            Server.Results.add(result);
        } catch (Exception e) {
            Server.createMessage("Listener:"+e.getMessage());
        } finally {
        }
    }

}

}[/code]

  1. 创建一个解析socket的 服务

[code="java"]import java.net.Socket;
import java.util.Date;
import java.util.Scanner;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.io.*;

import com.szcust.einfo.receiveEntity.serverEntity.DataText;

public class CreateServer implements Callable {
private Socket client;
private Scanner in;
private PrintWriter out;
private Resolve resolve;
private int timeOut = 30;
private Date lastTime;

public CreateServer(Socket s, ExecutorService pool) {
    client = s;
    lastTime = new Date();
    resolve = new Resolve();
    try {
        client.setSoTimeout(30 * 60 * 1000);
        Server.ClientCount = Server.ClientCount + 1;
        in = new Scanner(client.getInputStream(), "GB2312");

        // in = new BufferedReader(new
        // InputStreamReader(client.getInputStream(), "GB2312"));
        out = new PrintWriter(client.getOutputStream(), true);
        out
                .println("--- Welcome To Universtar Science & Technology Softwear System ---");

    } catch (Exception ex) {
        Server.createMessage("Ex " + ex.getMessage());
    }
}

@Override
public Integer call() {
    String line = "";
    while ((line = in.next()) != null) {
        try {
            if (check(line)) {
                DataText dataText = resolve.getDataTextBySoketString(line);
                if (dataText != null) {
                    // Server.Data_Array.add(dataText);
                    resolve.saveDataRun(dataText);//业务代码
                } else {
                    Server.createMessage("Resolve error " + line);
                }
            } else {
                Server.createMessage("Check error " + line);
            }

        } catch (Exception ex) {
            Server.createMessage("Ex " + ex.getMessage());
            closeSocket(this.client );
        }
    }
    Server.ClientCount--;
    return Server.ClientCount;
}[/code]
  1. 静态变量,用于保存各个线程之间的数据。

[code="java"]import java.util.Calendar;
import java.util.Vector;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

import com.szcust.einfo.receiveBiz.FactorBiz;
import com.szcust.einfo.receiveBiz.StationBiz;
import com.szcust.einfo.receiveEntity.einfoEntity.Station;
import com.szcust.einfo.receiveEntity.serverEntity.DataText;
import com.szcust.einfo.receiveEntity.configEntity.Config;
import com.szcust.einfo.receiveEntity.configEntity.ExLog;

public class Server{

public static  ConcurrentLinkedQueue<DataText> Data_Array = null;
public static Vector<Station> Client_Stations = null;
public static Vector<Station> Server_Stations = null;
private static ConcurrentLinkedQueue<String> Message = null;
public static ConcurrentLinkedQueue<String> ErrorText = null;
public static ConcurrentLinkedQueue<Future<Integer>> Results = null;

public static ExecutorService pool = Executors.newCachedThreadPool();
public static Config AppConfig = null;
public static int ClientCount = 0;
public static boolean IsClear = true;

public static void  init() {
    Data_Array =new ConcurrentLinkedQueue<DataText>();
    Client_Stations = new Vector<Station>();
    Server_Stations = new Vector<Station>();
    Message = new ConcurrentLinkedQueue<String>();
    ErrorText = new ConcurrentLinkedQueue<String>();
    Results = new ConcurrentLinkedQueue<Future<Integer>>();
    AppConfig = new Config();
    ClientCount = 0;
    IsClear = true;
    loadData();
}[/code]

5个回答

哦,我不是很清楚 MINA的实现,Netty里,是用线程池模型的,可以控制生成线程的上限。

Mina里如果找不到控制线程数的地方,我建议还是用Netty吧。
至少Netty算是公司在维护 :)

Blocking Socket不适合用线程池处理通讯。
单个线程会被挂起的。
用NIO才合适。

个人觉得没必要在accept后submit一个Callable

直接execute一个Runnable

同步好ClientCount就可以了吧

你的项目可以用外部库吗?

你可以看看Netty这个NIO库。(或者apache mina,netty是mina的创始者写的,我用起来蛮方便的。)

NIO是基于SELECT模型的。就是注册一批关注对象socketChannel,
然后重复调用Select方法,当SocketChannel处于指定状态,比如 有数据,可写
等状态,再拿出来处理。
这样,可以分成主线程持续select,select出来需要处理的socketchannel放到一个队列,由threadpool里分线程取出来 处理。

因为socketchannel操作不会阻塞,所以可以充分利用多线程。

而你的代码用的是普通socket,普通socket的特性就是在read时,如果没有数据,则会阻塞住。而如果想利用线程池,应当是read没有数据时,继续往下走,把当前线程资源还回线程池。

不用你主动结束那些线程,那些线程被应该会被设为 daemon=true,即主线程结束时自动结束。平时,等待 主监听线程传需要处理的任务进来,如果没有,则自己wait。

那些就是线程池里的线程。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
iis不能长时间运行的问题
现在我用一台计算机做服务器,配置如下:cpu奔3 600,内存128M,硬盘20G,我将c盘分了5G做为系统盘,我将虚拟内存配置成最大1G,安装系统windows2000server pack3,IIS5.0做了一个网站。现在状况:网站运行1天以内,正常,1天以后出现不能访问该网站。但是服务器的cpu占用率不高,而且内存和刚重新启动时的差别不是很多,虚拟内存无变化,服务器其他正常,可以通过网络访问服务器。忘了一句,因为做测试所以,网站的访问量也不大。但是就是不能访问该网站。为什么?谢谢解决
程序不能长时间运行
串口通讯程序(D7 + access2000),运行后可以运行一段时间(几个小时),然后就会出现exceptionrn对话框,提示raise exception at project address XXXXXX ,还有什么EAccessViolation 什么的。请问是那里出现问题了呢?rn在线等待rn
socket服务器线程池的实现
socket服务器侧的线程池的C++实现,已通过测试,非常好用,可运行在linux和windows环境
socket 线程池实现
一个很好的socket 线程池实现示例,希望对想了解线程池的朋友有所帮助
javascript长时间运行的问题!
我有一个网页在提交前要运行很长时间的javascript代码,rn导致IE 一段时间没有响应!rn怎么解决呢?rn
winform 长时间运行的问题
我做了一个采集程序.rn正常的网速情况下.rn程序主要用到的异步执行rn当运行前半个小时间很还正常.速度也可以,时间一久就,采集就开始慢了.到最后就死了.rn但是程序没有死,还是有反应的.就是没有执行代码的感觉.rnrn不知道各位有没有遇到 这个情况 ,rn代码功能很简单只用到HttpWebRequest这个去获取内容.rnfor(i=0;i<1000;i++)rnrn HttpWebRequest这个去获取内容.rnrn大概的内容就是上面的代码.时间一久就不执行这个功能.界面那些都动了没有卡起.rnrn不知道各位有没有遇到 这个情况 ,
如何保障SOCKET在ASP.NET下长时间稳定运行?
本人有一项目,在ASP.NET下使用异步SOCKET监测来与子站进行通信;经常出现线程异常问题并停止监听,网络通信中断。rn后又在GLOBal.asax文件中加入定时检查监听状态,但没有效果!rnrn如何保障SOCKET在ASP.NET下长时间稳定运行?rn如何保障SOCKET在ASP.NET下长时间稳定运行?
socket服务端长时间运行后连不上了
IOCP写的服务端,自己做过压力测试,连接上万个socket对象没有问题,但是现在发现这么个现象,放在服务器上连续运行了两个多月后,连接数统计出来也就1000多个,然后客户端连接不上了,telnet下也失败,重启下服务就好了。rn[size=16px][color=#FF0000] 请大侠们分析下,大概是哪里出现问题了?[/color][/size]
Socket线程池的问题!!!!!!!!
private Thread qSerTh;rn private TcpListener qTcpListener = null;rn rn private void button1_Click(object sender, EventArgs e)rn rn tryrn rn qSerTh = new Thread(new ThreadStart(ServerIng));rn qSerTh.IsBackground = true;rn qSerTh.Start();rn rn catchrn rn MessageBox.Show("线程启动错误");rn rn rnrn private void ServerIng()rn rn tryrn rn qTcpListener = new TcpListener(IPAddress.Parse("192.168.0.1"), Convert.ToInt16(11000));rn qTcpListener.Start();rn string msg = "";rn rn while (true)rn rn Socket QS;rn QS = qTcpListener.AcceptSocket();rn string RemoteEndPoint = QS.RemoteEndPoint.ToString();rn IPAddress remoteip = ((IPEndPoint)QS.RemoteEndPoint).Address;rn int remoteport = ((IPEndPoint)QS.RemoteEndPoint).Port;rn Byte[] Stream = new Byte[1024];rn QS.Receive(Stream);rn string save = System.Text.Encoding.UTF8.GetString(Stream);rn string[] ss = save.Split('|');rn switch (ss[0])rn rn case "Login"://验证用户登陆消息rn ..........rn break;rn default://发送错误参数rn break;rn rn QS.Close();rn rn rn catch rn finallyrn rn qTcpListener.Stop();rn rn rn //-------------------------------------------------------------------------------------rn 这段程序启动了一个线程在后台监听客户端的连接。rn 现在的问题是:连接后要交换很多数据,比较费时,很多客户端同时连接可能影响服务器的效率。rn 这时,我想使用线程池,但不知如何写,请高手指点。rn 另外,有人说BeginXXX方法和EndXXX方法会利用c#内置的线程池,且性能较高,是这样吗?这种方法又如何写呢?
端口转发--线程池socket问题
我在写一个端口转发程序,接受客户端连接后把数据转发到web服务器,是多线程的程序,我用网上的 rnrn聊天程序在本机上测试,好比开了10个客户端,1个服务器,这时候能正常通信,但关闭一个客户端的时 rnrn候,别的客户端却显示有服务器退出的消息,不该影响别的客户端的啊,而且有的发消息根本发不了了, rnrn客户端列表里有内容,但发不到服务器端,一个客户端关闭时我设置跳出了该线程函数的while循环,这 rnrn时候关闭了两个socket closesocket,而如果把这两句注释了的话就没有问题。 rnrn 我的理解是关闭一个客户端时只是把这个客户端通信用的两个socket关闭了,不会影响其它的啊 请大 rnrn家帮忙解决下
win7 下socket不能运行
在xp和2003下都良好运行的,到win7就不能运行了rn把所有防火墙和杀毒之类的都关掉了,rn但是还是提示“您的主机中的软件中止了一个已建立的连接。”
为什么我的socket不能通信
我在jBuilder7下用socket变了个小ATM程序,在自己的机上实现,但发现服务段与客户端根本不能通信,不知为什么???是不是我的socket的代码放错了地方???
socket实现TCP通信
TCP是一种可靠的,面向连接的协议。 在socket中,建立TCP连接的过程大致如下: 服务器端: 1.初始化套接字 2.创建服务器socket 3.将本机地址与服务器socket绑定在一起 4.服务器开始监听 5.服务器确认请求(确认之前时一种阻塞的状态),accept()函数生成一个新的套接字。 6.接收客户端发来的字符串 客户端: 1.初始化套接字
socket实现一对一通信
使用socket通信,给予TCP网络,能够实现一对一通信
一个linux下的socket线程池实现
一个完整的linux下socket通信及线程池的管理,可编译运行。
socket实现通信
用Java写的一个socket实现通信的小例子,画了GUI的界面,连了数据库,可能需要下swing的插件才能正常运行~ 小菜鸟的中间件作业
Socket实现简单通信
我们通过下面一个例子学习 Socket通信基本原理
利用socket实现通信
#include <winsock.h> #include <stdio.h> #pragma comment (lib, "ws2_32.lib ") BOOL InitWinsock(); void main() { SOCKET socket1; InitWinsock(); struct sockaddr_in local; struct sockaddr_in from; int fromlen =sizeof(from); local.sin_family=AF_INET; local.sin_port=htons(1000); ///监听端口 local.sin_addr.s_addr=INADDR_ANY; ///本机
socket实现聊天室通信
基于TCP 服务端: import socket # 1. 创建一个socket对象 server = socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM) # 2. 绑定IP和端口,供客户端连接 server.bind(('172.25.254.67',5000)) # 3. 监听是否有客户端连接 server.liste...
socket实现UDP通信
UDP与TCP不同,是一种无连接的通信方式,相比TCP而言更加灵活。 利用socket实现UDP的方式相比TCP而言也更加简单。 发送方: 1.初始化套接字 2.创建socket 3.利用sendto发送数据(TCP是send) 4.关闭socket 接收方: 1.初始化套接字 2.创建socket并与本机进行绑定 3.利用recvfrom接收数据 4.关闭socket
php5 实现socket 通信
php5 调试通过网上的代码,可以实现socket 通信
socket 通信实现
介绍Socket 通信实现方法,及代码详解。
Windows socket 通信的实现
使用比较简单的程序实现无加密套接字,希望对新手有些帮助
socket + 线程池
总结: socket 通信 socket通信是网络中计算机进行通信的一种方法 客户端: public class SocketClientHandlerImpl implements Runnable { private Socket socket = null; private DataInputStream dataInputStream = null; private DataOutputS...
线程池+socket
一个比较好的线程池+socket的实现 自己写的还不错
socket线程池
socket线程池 解决socket线程问题 希望对大家有帮助
为什么我的CFile不能长时间运行???
我用MFC的CFile类来记录log信息,运行6,7个小时以后就不能记录信息了,文件大概有70K左右,请大家帮忙分析一下是什么原因啊rn我用TraceFile.Open( NameBuffer,CFile::modeCreate|CFile::modeReadWrite )的方式打创建文件的,请多多指教!
求救关于socket连接长时间后不能收到信息的问题
小弟再做一个短信的合作平台接口,可是这个接口工作到半夜就收不到分发中心给的数据了.不知道怎么回事,请大家帮忙啊,下面是我的代码的主要部分,请各位高手指点啊rnrn s = new Socket(strIp,port);rn in = new BufferedReader(new InputStreamReader(s.getInputStream()));rn out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));rnrn out.write(msg);//此处为登陆串信息rn out.flush();rnrn boolean flag=true;rn cl=new CheckLink(in,out,s,jt,flag);//此处启动一个连接检测线程,用于监控连接是否正常rn cl.start();rnrn String line="";rn while((line=in.readLine())!=null)rn if(line.equalsIgnoreCase("PASS"))rn jt.append("Success connect server...\n");rn jt.append("=========================================\n");rn ss=new SmsSend(s,in,out,jt,true);//此处启动一个短信发送线程rn ss.start();rn rnrn //处理分发中心得测试指令,同时给出回应rn if(line.indexOf("activetest")!=-1)rn String reMsg=line.substring(line.indexOf("=")+1);rn out.write("Received CommandId="+reMsg+"\n");rn out.flush();rn rnrn if(line.indexOf("deliver ")!=-1)rn String recStr=line.substring(8);rn jt.append("========================================================\n");rn jt.append(sf.format(new java.util.Date())+"resive mo:"+recStr+"\n");rn jt.append("========================================================\n");rn Deliver d=new Deliver(out,in,recStr,jt);rn d.start();rn rnrn 下面是连接检测程序.不知道规范不规范了的.rnpublic class CheckLink extends Threadrn private String msg="XXXXXXX\n";//这里是连接登陆信息串,都已隐藏了的rn private BufferedReader in;rn private BufferedWriter out;rn private Socket s;rn private boolean flag;rn private JTextArea jt;rn public CheckLink(BufferedReader in,BufferedWriter out,Socket s,JTextArea jt,boolean flag)rn this.in=in;rn this.out=out;rn this.s=s;rn this.jt=jt;rn this.flag=flag;rn rn rn public void run()rn check();rn rn rn public void check()rn while(flag)rn /////////////////////////////rn while(s == null || s.isClosed() || !s.isConnected() ||!s.isBound() || s.isInputShutdown() ||s.isOutputShutdown())rn try rn jt.append("====================================\n");rn jt.append("socket is closed! reconnect it!\n");rn jt.append("====================================\n");rn s=s = new Socket(strIp, port);//这个IP和PORT都隐藏了的rn in = new BufferedReader(new InputStreamReader(s.getInputStream()));rn out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));rn rn //登陆服务端rn out.write(msg);rn out.flush();rn try rn sleep(1000*30);rn catch (InterruptedException e1) rn e1.printStackTrace();rn rn catch (UnknownHostException e) rn e.printStackTrace();rn catch (IOException e) rn e.printStackTrace();rn rn rn try rn sleep(1000*60*3);rn catch (InterruptedException e) rn e.printStackTrace();rn rn ////////////////////////////rn rn rn public boolean isFlag() rn return flag;rn rn public void setFlag(boolean flag) rn this.flag = flag;rn rnrn
求教,线程池运行的问题
import java.util.*;rnrnpublic class ThreadPoolrn public static void main(String[] args)rn while(true)rn Workers[] workers=new Workers[9];rn LinkedList threadManager=new LinkedList();rn for(int j=1;j<=9;j++)rn workers[j-1]=new Workers(j);rn threadManager.add(workers[j-1]);rn rn Thread workThread=(Thread)threadManager.removeFirst();rn workThread.start();rn rn threadManager.addLast(workThread);rn rn rn rn rnrn rnrnrnclass Workers extends Threadrn private int i;rn rn public Workers(int i)rn this.i=i;rn rn rn public void run()rn System.out.println("这是第"+i+"个工作线程");rn rn
一个关于socket线程池问题
写了一个epoll服务器, 用了线程池来处理包的收发, 服务器和客户端之间通信频率为0.1秒。rnrnlinux一个进程只支持256个线程? 我测试过300个客户端就要100个线程来维护, 如果同时处理2000以上客户端, 那不是不够了?
NIO与Socket笔记 :实现Socket 通信[ 四 ]
基于UDP的Socket通信 UDP (User Datagram Protocol,用户数据报协议)是一种面向无连接的传输层协议,提供不可靠的信息传送服务 。 无连接是指通信时服务端与客户端不需要建立连接,直接把数据包从一端发送到另 一端,对方获取数据包再进行数据的处理 。 UDP 是“不可靠的”,是指该协议在网络环境不好的情况下,会丢失数据包,因为没有数据包重传的功能,另外它...
NIO与Socket笔记 :实现Socket 通信[ 一 ]
基于TCP的Socket通信 TCP 是一种 流协议,以流为单位进行数据传输 。 什么是长连接? 长连接可以实现当服务端与客户端连接成功后连续地传输数据,在这 个过程中,连接保持开启的状态,数据传输完毕后连接不关闭 。 长连接是指建立 Socket 连 接后,无论是否使用这个连接,该连接都保持连接的状态 。 什么是短连接? 短连接是当服务端与客户端连接成功后开始传输数据,数...
Socket -1 实现socket的简单通信--案例
说明:               要求: 创建一个客户端, 向服务器发送数据   1.Client1: public class Client { /*属性:Socket,指定服务器的IP和端口*/ private Socket socket; public Client(){ try { socket = new So...
外网通信socket问题?
两台电信网络的机子 不是固定ip的 为什么通信不了? ip183查了ip 互相ping都ping不通 rnrn有做过外网socket通信的吗? 这样的情况要怎么才能socket通信呢? 请教下...
socket 通信问题
问题:简单说就是定时检测 socket连接状态rn 我现在用的是BCB中自带的 TClientSocket 控件,作为客户端, 服务器是一单片机。rn 程序启动,在配置文件中读取ip地址和端口号,连接服务器,若连接不成功则继续连接rn 连接成功则可以向服务器发送命令,服务器收到命令返回数据。rn 问题出在,如果连接成功,如果不给服务起发送命令,过一段时间(时间不定),socket会自动断开连接,但我这里检测测到已经断开,没有激发socket的任何事件,直到我给服务器发送命令,才发现断开了(偶尔会间隔很长一段时间检测到断开),这个该如何解决。 rn 还有就是socket如何检测例如像拔掉网线这样的断开?
SOCket 通信问题
做法:通过一个客户端同时监控多个服务端。rn客户端主动连接每一个服务端,成功后,创建接收线程接收服务端的数据,并放入QueueUserwork 线池中。rn但是当连接成功30左右个服务端后,创建的接收线程就收不到服务端的数据了,报错:10057、10060。rn原因何在:?rn
java通信Socket问题...
[img=http://pic.yupoo.com/joelin/814975461505/cehe0i4i.jpg][/img]rn实在是迫于无奈了...rn在网上转了几天,看了N本书...rn依然无法解决...rn呃,先说一下,这个是一个SOCKET通讯的小东西.是为这学期的结业考试做准备的...需要的功能就是在文本框里填入IP,然后在另一个文本框里输入文字,点发送后别外一个和这个一样的窗口可以正常接收显示,并且可以向这个窗口发送信息...rnrn如果有哪位高手发发善心,帮我解决下这个问题小弟在此感激不尽了...rn我们N多人等着您的到来...rn别外就是想问下,监听端口时为什么CPU会占到100%? 是不是因为一直在监听...rn望高手解答,浪费您一点时间,成就世界的未来...
socket 通信问题!!!!!!!!!
rn 我现在做的通信是指定服务器断的IP地址来连接服务器的,当连接不是服务器的IP,点击连接按钮后,rnrn会出现短时间的客户端死掉的状态rnrnrn 请问高手该如何处理!!!!!!!!
socket 通信 多线程的问题
A 向 B 发请求 B 处理后再向 C端转发,收到C端请求后,再转发给A.rnrn我属于B 端的代码。rnrn问题是多线程,当收到C端的请求后,找不到 A端的 socket id,请求发不回去了。rnrn请问该如何解决?rnrnrn最好能提供一段例子rnrn
串口通信和Socket 通信问题
通过RS232或者Socket实现,PDA与PC的传输rnrn现在我想进行优化的是,当串口线被拔出时,在TimeOut时间内,插上使能原先在传输的数据,接着传,这要怎么做?rnrnrn同样,Socket也是一样,当网络断掉,在TimeOut时间内,连接上网络使原先在传输的数据,接着传,这要怎么做?
相关热词 c++和c#哪个就业率高 c# 批量动态创建控件 c# 模块和程序集的区别 c# gmap 截图 c# 验证码图片生成类 c# 再次尝试 连接失败 c#开发编写规范 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数