【问题标题】:How to implement Peer code i.e., Server and Client code in the same file using java Socket programming如何使用 java Socket 编程在同一个文件中实现对等代码,即服务器和客户端代码
【发布时间】:2011-04-27 20:45:41
【问题描述】:

是否可以编写一个既作为服务器又作为客户端的程序?假设我有程序 P 的三个实例:P1、P2 和 P3。

  1. 在一个用例中,P2 从 P1 请求文件。
  2. 当 P1 向 P2 提供文件时,P1 从 P3 请求文件。
  3. P3 将文件提供给 P1。 (此时,P3 可以从 P1 或 P2 上传/下载。)

从概念上讲,我应该能够做到 这通过在 每次请求进入时线程。 有不同的方法吗?

编辑:


我有一些初始代码允许我作为客户端从服务器请求文件(提供服务器端口号和文件名)。相同的代码还启动了一个服务器线程,该线程同时侦听传入的请求。因此,实际上,此代码库充当 Peer(客户端和服务器)。

但是,我现在的问题是在发出第一个文件请求后,代码在服务器部分永远循环,实际上不允许我作为客户端发出任何额外的请求。那么我的问题是:我可以在服务器侦听端口时保持套接字打开,而 不需要服务器无限循环吗?这样,我就可以在“后台”运行服务器,并能够根据需要向客户端发送命令。

【问题讨论】:

    标签: java multithreading sockets p2p


    【解决方案1】:

    是的,这是完全可能的,实际上非常普遍。大多数企业应用程序都利用了这一点。

    例如,用户从网络服务器请求一个网页在浏览器中显示。更准确地说,用户请求显示第 23 条。

    网络服务器然后请求有关第 23 条的数据库信息。根据数据库服务器的响应,网络服务器构建一个格式良好的 HTML 页面以显示给用户。

    从概念上讲,使用网络只是一种通信方式,即发送或接收信息。这与从文件中写入/读取没有太大区别。而在linux中,也是如此。

    所以是的,每个服务器都可以监听一个端口,同时又是另一个服务器的客户端。 JAVA 语言中服务器的经典实现是在服务器端每个客户端使用一个线程。

    这意味着当 P2 连接到 P1 时,在 P1 和 P2 之间建立了一个新的连接,并且 P2 使用一个线程向 P1 写入响应......在大多数简单的情况下,同一个线程实际上会请求丢失的信息来自其他服务器,因此发送请求并等待响应。

    回应您的编辑:

    服务器的经典线程实现是通过无限循环监听端口。每次检测到来自客户端的连接请求时,您都会建立连接,协商客户端和服务器上用于此通信的端口,并将此连接委托给另一个线程(通常使用线程池,以不重用线程通信完成后的下一个客户端)。

    这样,您的线程始终可以响应来自客户端的连接请求。

    【讨论】:

    • 感谢您的回复。我会尽快发布我的代码。也许,我将两个不同的问题合二为一。但是,到目前为止,我得到了您的意思,并且可能我的实现与您的评论一致,但减去了线程池。每次有请求时,我都会创建一个全新的线程。另外,我想我为客户端和服务器使用相同的端口(因为它们在同一台机器上)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多