【问题标题】:Java Sockets - Need help understanding them betterJava Sockets - 需要帮助更好地理解它们
【发布时间】:2012-05-13 01:20:56
【问题描述】:

好的,我已经阅读了 Oracal 网站上的内容以及该网站上的一些问题。我仍然很难理解一些关于套接字的事情,所以我会看看这里是否有人可以花时间向我缓慢的大脑解释它。我正在做的是建立一个聊天客户端和聊天服务器(一举学习摇摆和套接字)。尽管我看过所有的例子,但我仍然不能安静地理解它们是如何工作的。我知道 1 个带有输入流的套接字和 1 个带有输出流的套接字是如何工作的,但除此之外,我很难理解,因为这是我找到的大多数资源所解释的。这是我关于此的一系列问题。

  1. 如果我希望能够同时处理客户端的输入和输出,我会怎么做?等待out,那么如果服务器有变化切换到输入流并得到变化,然后切换回输出流?或者我可以同时运行输入和输出流吗?
  2. 假设服务器必须同时处理多个客户端。我必须为每个客户制作一个套接字,对吗?你会建议什么是处理这个问题的好方法?
  3. 假设客户端想要更改其当前套接字的 IP 地址或端口并连接到不同的服务器。我会创建一个新的套接字,还是有什么方法可以改变当前的?

这是我的主要问题。如果我能理解这么多,我很确定我可以自己弄清楚我需要的其余部分。

.

【问题讨论】:

    标签: java sockets networking client-server


    【解决方案1】:

    这是一个很好的套接字指南。它本身不是“Java 套接字”,但我认为您会发现它非常有用:

    Beej's Guide to Network Programming

    回答您的问题:

    问:如果我希望能够处理客户端的输入和输出 同时我会怎么做?

    A:你不必做任何特别的事情。套接字是自动“双模式”的:您可以随时读取(如果有任何数据)或写入。

    问:假设服务器必须同时处理多个客户端。生病 必须为每个客户端创建一个套接字吗?

    A:实际上,系统会为提供每个新客户端连接的套接字。你没有“创造”一个——它是给你的。

    每个新连接都是一个新套接字。

    通常,您的服务器会生成一个新线程来服务每个新的客户端连接。

    问:假设客户想要更改其 IP 地址或端口 当前套接字并连接到不同的服务器。我会创建 一个新的套接字,或者有什么方法可以改变当前的?

    A:客户端将终止现有连接并打开一个新连接。

    【讨论】:

    • (我会读)谢谢!这真的帮助我理解了。我发现的所有内容都只是告诉我如何在 Java 中设置套接字,并没有真正解释它们是如何工作的。
    【解决方案2】:

    我会尽力在这里做到最好,但我真的不认为这里是这类问题的地方:

    首先,您需要了解套接字是底层操作系统套接字(unix 套接字、win socks 等)的抽象。

    这些类型的套接字用于模拟传输层的面向连接的服务(查看 OSI 模型)。所以这意味着套接字为您提供来自客户端的字节流和发送到客户端的字节流,因此回答您的第一个问题,这些流是独立的。当然,您负责设计您在这些流上发言的协议。

    要回答您的第二个问题,您需要了解 TCP 连接的工作原理,基本上,您的服务器正在一个端口中侦听一个或多个网络接口(端口是 TCP 寻址机制),并且可以处理可配置的传入同时连接的积压。所以答案是,对于任何传入的连接,服务器上的新线程通常会从线程池中创建或获取。

    要回答您的第三个问题,主机之间会建立连接,因此如果您需要更改其中任何一个,则需要创建新连接。

    希望这会有所帮助。

    干杯

    【讨论】:

    • 端口不是进程号。积压与可以处理多少连接无关。您所写的内容都没有暗示每个连接都需要一个新线程。
    • 我认为你在这里太严格了,我不是说进程号 = PID,我只是说一个代表正在侦听数据的进程的数字,只是寻址。您不需要每个连接都有一个线程,但这是处理多个客户端的常用方法,当时我正试图变得更具指导性而不是高级。
    • 我不同意。我想说你在这里太草率了,特别是如果你想“说教”。当您说“进程号”时,读者不可避免地会想到 PID,而端口首先不是进程。您的回答清楚地表明“对于任何传入连接,您都必须创建一个新线程”。你没有,之前的“所以”甚至没有意义。你可以随时编辑它。
    【解决方案3】:

    1.- 如果我希望能够同时处理客户端的输入和输出,我会怎么做?等待出来,然后如果有变化 服务器切换到输入流并获取更改,然后切换 返回输出流?或者我可以同时运行输入和输出流吗 一次?

    这取决于您的协议,如果您的客户端启动连接,那么您的服务器会等待输入,然后再转到输出流并发送一些东西。每个连接,无论是 tcp 连接还是处理文件,都有一个输入流和一个输出流。

    2.- 假设服务器必须同时处理多个客户端。我必须为每个客户制作一个套接字,对吗?你会建议什么是 有什么好办法处理吗?

    为此有不同的策略,包括多线程,因此现在专注于流。或者将其保留在一台服务器和一台客户端上。

    3.- 假设客户端想要更改其当前套接字的 IP 地址或端口并连接到不同的服务器。我会不会 创建一个新的套接字,或者有什么方法可以改变当前的?

    是的,套接字的定义是 IP 地址通过特定端口建立的连接,如果其中任何更改都需要新的套接字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-11
      • 2010-11-07
      • 2015-03-27
      • 2013-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多