假设我们在 Java中有一个简单的Echo客户端/服务器对.据我了解,一旦套接字的一侧断开,整个连接就消失了.

但是,如果我希望服务器能够始终保持活力,即使客户端死亡,该怎么办呢?我希望能够恢复断开的连接.

回声服务器:

import java.net.socket;
import java.net.ServerSocket;

public class EchoServer {

    public static void main(String[] args) throws Exception {

        // create socket
        int port = 4444;
        ServerSocket serverSocket = new ServerSocket(port);
        System.err.println("Started server on port " + port);

        // repeatedly wait for connections,and process
        while (true) {

            // a "blocking" call which waits until a connection is requested
            Socket clientSocket = serverSocket.accept();
            System.err.println("Accepted connection from client");

            // open up IO streams
            In  in  = new In (clientSocket);
            Out out = new Out(clientSocket);

            // waits for data and reads it in until connection dies
            // readLine() blocks until the server receives a new line from client
            String s;
            while ((s = in.readLine()) != null) {
                out.println(s);
            }

            // close IO streams,then socket
            System.err.println("Closing connection with client");
            out.close();
            in.close();
            clientSocket.close();
        }
    }
}

任何提示赞赏谢谢

解决方法

您缺少的是“会话”的概念.想想服务器的位置,当某些位到达“线路”时.怎么办这些?使用TCP / IP,线路上已经存在一些信息,即:

> src addr
> src端口
> dest addr
>目的港
>和消息有效负载本身
>和其他一些东西(比如序列计数器,以确保’数据包’在传输过程中不会混乱)

服务器的操作系统使用src / dest addr / port信息来判断这是否是“正在进行的对话”.主要是它认为dest端口(因为消息已经通过互联网和防火墙将其发送到机器本身)来决定它是否适合用于监听’dest端口’的Java程序.但是,它使用整个src-addr / src-port / dest-addr / dest-port尝试按发送方发送的顺序将有效负载传送到您的程序(这可能不是它们到达的顺序,因为干预互联网).请注意,单个“消息”实际上可能会拆分为多个数据包.您的操作系统的TCP / IP堆栈正在为您做一些工作.

但是,请注意,为了代表您执行此功能,操作系统必须投入一些资源来“跟踪TCP / IP会话的状态”.至少,对于每组port / addr src / dest,需要有一个最后收到的“数据包”的计数器,一些缓冲空间来保存数据包直到你的程序准备好消耗它们,所以向前.

现在,TCP / IP堆栈实现者所面临的问题是“我应该在多长时间内保持这种状态”?足够10秒? 20分钟?在某些时候,在没有从客户端听到一段时间后,会话必须“超时”.如果序列中有更多的数据包要发送,并且客户端再次开始发送它们,那么服务器必须能够说“对不起,你发送了一些先前消息的数据包234,但因为我没有收到来自你有一段时间了,我丢掉了1-233包.我们可以重新开始吗?“

所以从这个意义上说,没有办法阻止客户端“断开连接”.当然,如果客户端恢复并发送更多数据,您可以继续监听套接字.但是你和你的客户需要一种方法来“选择我们离开的地方”.

在HTTP中,这是使用’会话cookie’实现的 – 一个服务器提供给客户端的长唯一字符串,客户端重新发送每个新请求(无论它是否发生在同一个TCP级会话上).这是一个“应用程序级会话”,其生命周期比TCP会话的生命周期长.

既然你正在编写一个应用程序,听起来你对客户端和服务器之间的相互控制权(“协议”)有一定程度的控制权,那么你可以选择更多关于如何就什么是会话,如果客户’消失'(会话超时),以及双方如何恢复并“从我们中断的地方继续”(重新建立会话)如何处理事情.你不要忘记身份验证!

正如其他人所说,这在很大程度上取决于你想要实现的目标.

在java网络编程中,即使客户端关闭,有没有办法让服务器端保持打开状态?的更多相关文章

  1. 如何在 Swift 中使用 Alamofire 进行网络编程

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  2. NodeJS学习笔记之网络编程

    Node.js采用了Google Chrome浏览器的V8引擎,性能很好,同时还提供了很多系统级的API,如文件操作、网络编程等。Node.js则是一个全面的后台运行时,为Javascript提供了其他语言能够实现的许多功能。今天我们来看下Nodejs的网络编程

  3. php的在线网络编程的替代方案?

    我第一次使用PHP学习网络编程.它有一些功能,我觉得非常有帮助,但整体语言不是我喜欢的东西,就像个人喜好.我想知道使用不同的底层编程语言(Python?)可以使用哪些替代方法来提供类似的功能.我正在寻找:>通用编程能力>嵌入HTML的在线服务器端代码>访问请求参数>发送标题,设置cookie等的能力较好的是:>不需要单独的服务器进程>易于连接到Apache有没有人有什么建议?

  4. delphi6网络编程 socket编程练习

    总结以上是DEVMAX为你收集整理的delphi6网络编程socket编程练习全部内容。如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

  5. delphi技术专题---获取网卡物理地址之NetBios网络编程接口LANA介绍

    总结以上是DEVMAX为你收集整理的delphi技术专题---获取网卡物理地址之NetBios网络编程接口LANA介绍全部内容。如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

  6. delphi网络编程

    总结以上是DEVMAX为你收集整理的delphi网络编程全部内容。如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

  7. cocos2d-x3.2与服务端框架Firefly的网络编程初级网络通讯

    好久没写东西,最近在研究服务端框架Firefly和Pomelo,身为菜鸟的我的确花了很大功夫才看懂一些源代码。Firefly是开源游戏服务器框架,可以直接到九秒社区下载安装,这里不说安装过程了,我使用的是新版的gFirefly,这个也是可以在gitHub上下载到,安装会麻烦些,话说好久没更新了唉……所以这里需要了解一下Firefly的通讯协议。

  8. Cocos2d-x_HTTP网络编程

  9. cocos2d-x网络编程 连接php服务器笔记1

    学习cocos2d-x网络编程是一个非常尴尬的问题,因为熟悉cocos2d-x的学习者基本在游戏开发一块属于客户端编程,想自学网络编程必不可少的牵扯到服务器这块。现在我们的目的很明确,想掌握cocos2d-x如何与服务器交互,起码是怎么向服务器发起响应,怎么处理服务器传回的数据。

  10. cocos2d-x网络编程 连接php服务器笔记2

    对了,还没有数据库,第一步当然是建立自己的服务器数据库啦。uname=wang&upass=123来添加一个用户,网页显示“1,insertok”表示添加用户成功,打开MysqL数据库检查是否添加成功。验证登录:在testPHP目录里再新建个checkLogin02.PHP文件,代码如下:上面逻辑实现了PHP验证用户名和密码验证功能,想看效果可以在浏览器里输入http://127.0.0.1/testPHP/checkLogin02.PHP?服务器部分完成了,下节开始写我们最擅长的cocos2d-x客户端

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部