【问题标题】:socket hangs after idle time :server - client java program空闲时间后套接字挂起:服务器 - 客户端 java 程序
【发布时间】:2014-12-09 10:28:12
【问题描述】:

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

服务器:

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();
			}

		}

	}

【问题讨论】:

  • 我猜你的意思是idle,而不是ideal
  • 在您的服务器挂起时,您并行运行了多少线程? “下一个请求到来时服务器空闲”是什么意思?服务器什么时候不空闲?
  • 当服务器长时间没有收到请求(空闲)时,当发起新请求时它会挂起。但是当我从本地机器发起请求时它可以工作(本地机器和服务器都在局域网中)
  • 最有可能的是 accept 不会在新连接上触发。当我们的防火墙丢弃空闲连接时,我已经看到了这种情况。你能检查一下你的网络基础设施吗?
  • 在我们实现了 set sockettimeout 之后它工作了。

标签: java sockets serversocket server tcp-ip


【解决方案1】:

在我们实现 set sockettimeout 后它就起作用了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 2016-02-06
    • 1970-01-01
    • 2012-06-05
    • 2015-06-21
    • 1970-01-01
    相关资源
    最近更新 更多