急急急! 程序在运行一段时间后死掉了 程序的控制台有提示内容吗? 最大的可能是与数据库打交道时出现的问题,检查是否每次都关闭了statement和resultset,一个connect最多支持300个statement. 肯定是逻辑上的错误. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 谢谢楼上各位,能说清楚一些吗? 昨天以前是不是8天才停了一次,现在是一天就停了两次,是什么原因呢? 我的程序大概是这样的: 接收到信息时,按照信息来查询数据库,然后向客户端返回查询到的信息,CoolAbu(阿卜-Never Stop(★★★★)) ,再把逻辑看看是什么意思呀?在本机用了一个测试用的客户端来连接,但没反应maobing(流浪了一年):能说清楚一些吗?谢谢你了!napoleonz(愣头青):控制台没有内容,我用了一个测试的客户端,运行时收不到反回信息程序片断:public class listenSocket implements Runnable { Socket socket1; String reply = ""; public listenSocket() { super(); } listenSocket(Socket socket) { this.socket1 = socket; } public void run() { try { InputStream is = socket1.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); char c[] = new char[136]; //receive jy data while (c1 < 136) { //js_jyxx c[c1] = (char) br.read(); c1++; } cljy(receive); OutputStream os = socket1.getOutputStream(); OutputStreamWriter osr = new OutputStreamWriter(os); BufferedWriter bw = new BufferedWriter(osr); System.out.println("reply="+reply) bw.write(reply); bw.flush(); os.close(); } catch (Exception e) { System.err.println("error:" + e.getMessage()); outnet.writelog("error | listenSocket.java |"+e.getMessage() +"| "); }} public void cljy(String received) { Statement statement; try { String query_String = "select ***"; Connection con_js = SocketServer.con; statement = con_js.createStatement(); ResultSet resultset = null; System.out.println("query_String=" + query_String);//*** resultset = statement_js.executeQuery(query_String); reply = "***" } }出错的时候,能打印出"query_String=***,但后面就开始不动了,正常的话应该后面应该打印出"reply="+reply的,这时对其它的请求也不再响应发送的数据包本身好象又没有问题,因为我重新运行程序后,再发一次出错时的数据包,又可以正常处理了public class SocketServer { public SocketServer() { super(); } public static void main(String args[]) { try { ServerSocket s = new ServerSocket(ServerPort); System.out.println("listening..."); while (true) { Socket socket = s.accept(); listenSocket server = new listenSocket(socket); Thread thread = new Thread(server); thread.start(); } } catch (Exception ex) { ex.printStackTrace(); outnet.writelog("error | SocketServer.java |"+ex.getMessage() +"| "); } }}程序由于我删除了一些东西,可能语法上会有问题,但事实上是没事的 napoleonz(愣头青),statement我关掉了,resultset好象没关,不是statement关了就可以了吗? 如果statement没关的话,是有出错提示的,就是提示超过最大的光标数之类的提示,而且,在死掉前处理的业务已经远远超过了300了 看了一下阻塞的问题,如果说某个socket连接,假定名为A,在得到它的值后,进行处理,然后返回给客户端,如果单独是这个A出了问题,不能返回数据给客户端,这还可以理解,但是现在的问题是socket服务器不能再处理新的连接了,郁闷! 在连接处理程序中是否还有新的Socket呢? 想了想,由于你的客户端是C的。是否可能出现类似下面的错误呢?如果不是千万不要骂我。Server.javaimport java.io.*;import java.net.*;class T extends Thread{ Socket s; public T(Socket s){ this.s = s; } public void run(){ try{ InputStream in =s.getInputStream(); OutputStream out = s.getOutputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in)); System.out.println(br.read()); System.out.println(br.read()); }catch(Exception e){ System.out.print(e); } }}public class Server{ public static void main(String [] args){ ServerSocket server = null; Socket s = null; int i = 0; try{ server = new ServerSocket(12600,10); while(true){ try{ s = server.accept(); new T(s).start(); System.out.println(i++); }catch(Exception e){ System.out.print(e); } } }catch(Exception e){ System.out.print(e); } }}Client.javaimport java.io.*;import java.net.*;public class Client{ public static void main(String [] args){ Socket socket = null; try{ socket = new Socket("127.0.0.1",12600); InputStream in = socket.getInputStream(); OutputStream out = socket.getOutputStream(); out.write(54); }catch(Exception e){ System.out.print(e); } }} 如果正在尝试着从客户端读数据时,客户端无端地关闭了,应该会出现上面的现象。System.out.println(br.read());//比方说,你认为到这里客户端的输入还没有结束,所以继续读入,但事实上客户端不再发送了。System.out.println(br.read()); 一个朋友说不要一直用一个数据库连接,因为一个连接长时间存在会有问题,建议在每次有交易时都打开一个数据库链接,用完后关闭,但我今天发现有点问题:运行时如果客户端一次发送一个交易,交易结束后再发下一个,就没有问题,但同时发送两个交易时就不行了,(即在两个线程中同时打开数据库链接),会出错,提示jdbc或oracle的某些东西已经load,奇怪的是这些错误捕捉不到,只是在运行时才打印出一大串的错误.谁知道怎么解决呢? 建议catch{}后面加上finally{}块将IO,Socket和Connect,Statement Result等占用资源,又不能自己回收的对象关闭,并=null这样如果出现异常,可以在finally中释放资源! 对Socket加上一个Timeout时间参数,阻塞timeout时间后,就让read方法返回! 请问如何不用hostname或者ip address在局域网连接? jni调用如果出异常,是当前运行线程崩溃呢,还是整个jvm崩溃 javac和java编绎运行? 每次取properties中一个属性时都会重新加载properties文件吗? 有关jspsmartupload禁止扩展名问题 剪刀石头布的游戏,哪个高手帮帮看能优化不?? 从一个数组中随机不重复的选择多个元素 我觉得一个书本上有错的问题,请大家帮帮解释解释. 一个关于main方法的问题,请高手解释一下 关于进程间SHARE变量的问题 在java中如何使用数据缓冲池技术连接数据库 如何用JAVA写一个FTP的服务器端和客户端?
CoolAbu(阿卜-Never Stop(★★★★)) ,再把逻辑看看是什么意思呀?在本机用了一个测试用的客户端来连接,但没反应maobing(流浪了一年):能说清楚一些吗?谢谢你了!napoleonz(愣头青):控制台没有内容,我用了一个测试的客户端,运行时收不到反回信息程序片断:public class listenSocket
implements Runnable {
Socket socket1; String reply = ""; public listenSocket() {
super();
} listenSocket(Socket socket) {
this.socket1 = socket;
} public void run() { try {
InputStream is = socket1.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
char c[] = new char[136]; //receive jy data
while (c1 < 136) { //js_jyxx
c[c1] = (char) br.read();
c1++; }
cljy(receive);
OutputStream os = socket1.getOutputStream();
OutputStreamWriter osr = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osr);
System.out.println("reply="+reply)
bw.write(reply);
bw.flush();
os.close();
}
catch (Exception e) {
System.err.println("error:" + e.getMessage());
outnet.writelog("error | listenSocket.java |"+e.getMessage() +"| "); }
}
public void cljy(String received) { Statement statement;
try {
String query_String = "select ***";
Connection con_js = SocketServer.con;
statement = con_js.createStatement();
ResultSet resultset = null;
System.out.println("query_String=" + query_String);//***
resultset = statement_js.executeQuery(query_String);
reply = "***"
}
}
出错的时候,能打印出"query_String=***,但后面就开始不动了,正常的话应该后面应该打印出"reply="+reply的,这时对其它的请求也不再响应发送的数据包本身好象又没有问题,因为我重新运行程序后,再发一次出错时的数据包,又可以正常处理了public class SocketServer {
public SocketServer() {
super();
} public static void main(String args[]) {
try {
ServerSocket s = new ServerSocket(ServerPort); System.out.println("listening...");
while (true) {
Socket socket = s.accept();
listenSocket server = new listenSocket(socket);
Thread thread = new Thread(server);
thread.start();
}
}
catch (Exception ex) {
ex.printStackTrace();
outnet.writelog("error | SocketServer.java |"+ex.getMessage() +"| "); } }
}程序由于我删除了一些东西,可能语法上会有问题,但事实上是没事的
Server.javaimport java.io.*;
import java.net.*;class T extends Thread{
Socket s;
public T(Socket s){
this.s = s;
}
public void run(){
try{
InputStream in =s.getInputStream();
OutputStream out = s.getOutputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
System.out.println(br.read());
System.out.println(br.read());
}catch(Exception e){
System.out.print(e);
}
}
}public class Server
{
public static void main(String [] args){
ServerSocket server = null;
Socket s = null;
int i = 0;
try{
server = new ServerSocket(12600,10);
while(true){
try{
s = server.accept();
new T(s).start();
System.out.println(i++);
}catch(Exception e){
System.out.print(e);
}
}
}catch(Exception e){
System.out.print(e);
}
}
}Client.javaimport java.io.*;
import java.net.*;public class Client
{
public static void main(String [] args){
Socket socket = null;
try{
socket = new Socket("127.0.0.1",12600);
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
out.write(54);
}catch(Exception e){
System.out.print(e);
}
}
}
System.out.println(br.read());//比方说,你认为到这里客户端的输入还没有结束,所以继续读入,但事实上客户端不再发送了。
System.out.println(br.read());
运行时如果客户端一次发送一个交易,交易结束后再发下一个,就没有问题,但同时发送两个交易时就不行了,(即在两个线程中同时打开数据库链接),会出错,提示jdbc或oracle的某些东西已经load,奇怪的是这些错误捕捉不到,只是在运行时才打印出一大串的错误.谁知道怎么解决呢?
后面加上finally{}块
将IO,Socket和Connect,Statement Result等占用资源,又不能自己回收的对象关闭,并=null
这样如果出现异常,可以在finally中释放资源!