zoukankan      html  css  js  c++  java
  • 如何使用socket进行java网络编程(五)

    本篇记录:

           1、再谈readLine()方法

      2、什么是真正的长连接

    最近又参与了一个socket的项目,又遇到了老生常谈的readLine()问题:对方通过其vb程序向我方socketServer程序发送报文,后天日志查看有read超时的异常。

    关于line=readLine()方法,其为一个阻塞方法,遇到 、 、 时会返回此时为止读到的数据,作为“一行”赋值给line变量。而之后除非超时或者发送端关闭输出流,readLine()才会返回null,代表读取结束。也就是说如果不是超时或关闭流,那么readLine()读取完所有行之后仍然会一直阻塞。

    下面代码为客户端的发送代码,红字为关键,正是其确保服务器端的readLine()方法结束阻塞。

    Socket clientSocket = new Socket(address, port);
            LOGGER.debug("网络" + address + ":" + port + "初始化已经完成,服务端已连接!");
            PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
            try {
                // 向clientSocket中写入报文
                Integer length = msg.toString().length();
                String lengthStr = length.toString();
                while (lengthStr.length() < 5) {
                    lengthStr = "0" + lengthStr;
                }
                System.out.println(lengthStr + msg);
                writer.println(lengthStr + msg);
                writer.flush();
                clientSocket.shutdownOutput();
                LOGGER.debug("上送信息:" + lengthStr + msg);
                //等待回复
                InputStream is = clientSocket.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String str = br.readLine();
                LOGGER.debug("读取返回信息:" + str);
                System.out.println(str);
                if (StringUtils.isNotEmpty(str) && str.startsWith("1|")) {
                    isSucc = true;
                }
                clientSocket.shutdownInput();
            } catch (Exception ex) {
                LOGGER.error("上送报文异常", ex);
                System.out.println(ex.getMessage());
                isSucc = false;
                return isSucc;
            } finally {
                writer.close();
                
            }

    在C、VC、VB中也是一样的,因为网络通信底层是相通的:

    最后,上述技术方案中实际上是使用TCP socket实现的一种短连接通信:客户端打开socket连接,然后发送报文,关闭输出流,接受服务端返回报文,关闭输入流,关闭连接; 服务端收到客户端socket连接,使用输入流接收上送的报文,处理,使用输出流向客户端发送返回报文。

    那么真正的长连接是怎样的呢? 首先,长连接在于不是上述这种打开-发送-接收-返回-关闭的方式,而是在一段长时间内保持连接而不关闭,或者在连接空闲时超时关闭的时候,通过心跳检测机制,发现超时关闭而重新建立连接。与短连接相比,减少了打开-关闭连接的开销。

  • 相关阅读:
    FCKEditor使用说明
    如何查看索引或table所佔用的實際空間
    java字节输入流
    文件的读写操作
    利用JProfiler
    javascript面向对象技术基础(五)
    深刻理解Linux进程间通信(IPC)
    JAVA中操作数据库方式与设计模式的应用 2
    javascript面向对象技术基础(六)
    FCKeditor在线编辑器
  • 原文地址:https://www.cnblogs.com/lyhero11/p/8047642.html
Copyright © 2011-2022 走看看