繁体   English   中英

空闲时间后,套接字挂起:服务器-客户端Java程序

[英]socket hangs after idle time :server - client java program

您好,我编写了一个服务器程序来接收ISO8583-93版本的请求,然后处理它们并发送响应。我将接收连续的请求。它可以正常工作,但是如果下一个请求到来时套接字空闲,则服务器无法读取。 请在下面找到代码片段

服务器:

 public class MBServ { public static void main(String[] args) throws IOException { ServerSocket serverSocket = null; boolean listening = true; String request_date = null; String request_time = null; try { serverSocket = new ServerSocket(7777); } catch (IOException e) { System.err.println("Could not listen on port: 7777."); System.exit(-1); } while (listening) { new MBServT(serverSocket.accept()).start(); } serverSocket.close(); } } 

线:

 public class MBServT extends Thread { private Socket socket = null; Logger log = Logger.getLogger(MBServT .class.getName()); public MBServT(Socket socket) throws FileNotFoundException, IOException { super("MBServT"); this.socket = socket; } public void run() { String inputLine = ""; String msgType = null; int response = 12; String outwardMsg = null; BufferedReader buffReaderObj = null; // String ip = "172.30.12.69"; String stanNo = "0"; boolean ISSUBFIELDPARSING = false; GenericPackager packager; try { packager = new GenericPackager("basicparse.xml"); BufferedReader is = new BufferedReader(new InputStreamReader(socket .getInputStream(), "ISO8859_1")); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter( socket.getOutputStream(), "ISO8859_1")); String strBuf = null; int length = 4; char[] chrBuf = new char[length]; int cnt = 0; while (true) { socket.setKeepAlive(true); int value = 0; int ret = 0; ret = is.read(chrBuf, 0, chrBuf.length); if (-1 == ret) { log.error("nothing to read closing socket"); try{ socket.close(); } catch(Exception e){ System.out.println("Error in socket.close: " +e.toString()); } throw new Exception("Read Error: Socket closed"); } strBuf = new String(chrBuf); chrBuf = new char[Integer.parseInt(strBuf)]; is.read(chrBuf, 0, chrBuf.length); strBuf = new String(chrBuf); chrBuf = null; chrBuf = new char[4]; value = 0; /*writing response*/ Runnable respThread = new MBServRespT(writer, fieldList, "threadname"); ((Thread) respThread).start(); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("Error::" + e.toString()); } finally { try { socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 

在实现set sockettimeout之后,它起作用了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM