java socket编程 长链接处理

在进行Java socket编程的时候,涉及到两种链接方式,一种是短连接,一种是长连接。当我们在学习网络编程TCP的时候,一般都只是涉及到短连接编程,很少会涉及到长连接,那么什么是长连接,什么是短连接呢?


1.概念:

短连接:指建立SOCKET连接后发送后接收完数据后马上断开连接,比如http,只是连接、请求、关闭,过程时间较短,服务器若是一段时间内没有收到请求即可关闭连接。

长连接:指建立SOCKET长连接就指的是一直保持连接,不管当前是否发送或者接收数据。 如果双方都没有一方对这个链接做处理操作的话,那么这个链接保持链接状态,这是非常不安全的。

2.使用时机:

长连接:多用于操作频繁,点对点的通讯,而且必须是连接的数量不能太多的情况下。因为每个TCP连接的建立都需要三次握手,每个TCP连接的断开要四次握手。如果每次操作都要建立连接然后再操作的话处理速度会降低,所以每次操作后,下次操作时直接发送数据就可以了,不用再建立TCP连接。

短连接: web网站的http服务一般都用短连接。因为长连接对于服务器来说要耗费一定的资源。像web网站这么频繁的成千上万甚至上亿客户端的连接用短连接更省一些资源。试想如果都用长连接,而且同时用成千上万的用户,每个用户都占有一个连接的话,可想而知服务器的压力有多大。所以并发量大,但是每个用户又不需频繁操作的情况下需要短连接。

当使用长连接处理通信的时候,会遇到的第一个问题就是在规定的时间内,如果双方没有通信的时候,我们如何断开链接,减少服务器资源呢?

代码附上:


import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import com.aoChine.util.CloseUtil;

/**
 * 调度线程,对应对处理每个请求的数据
 * @author 奔跑的浮云
 */
public class ServerTest implements Runnable {

    private Socket client;
    boolean running = true;

    public ServerTest(Socket client) {
        this.client = client;
    }

    @Override
    public void run() {
        long lastReceiveTime = System.currentTimeMillis(); // 最后一次发送数据的时间
        long receiveTimeDelay = 1000 * 10; // 超时时间
        InputStream in = null;

        try {
            in = client.getInputStream();
            while (running) {
                if (System.currentTimeMillis() - lastReceiveTime > receiveTimeDelay) {  //规定时间内没有数据发送
                    System.out.println("长时间没有信息发送,服务器自动断开连接");
                    // 长时间未发送数据
                    over();
                } else {
                    if ((in.available()) > 0) {
                        int len = 0;
                        StringBuffer data = new StringBuffer();
                        byte[] buf = new byte[1024];
                        while ((len = in.read(buf)) != -1) {
                            data.append(new String(buf, 0, len));
                        }
                        // 修改过期时间
                        lastReceiveTime = System.currentTimeMillis();
                        // 从新开启一个线程来处理数据,减少这个方法中的业务逻辑
                        new Thread(new NMEA0183(data.toString())).start();
                    } else {
                        try {
                            Thread.sleep(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                            over();     //记得关闭
                        }
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
            over();
        }
    }

    /**
     * 关闭Socket
     */
    private void over() {
        if (running)
            running = false;
        if (client != null) {
            CloseUtil.closeSocket(client);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值