1

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

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

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

.

4

3 回答 3

6

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

Beej 的网络编程指南

要回答您的问题:

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

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

问:假设服务器必须同时处理多个客户端。我必须为每个客户制作一个套接字,对吗?

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

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

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

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

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

于 2012-05-13T01:33:19.703 回答
1

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

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

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

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

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

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

于 2012-05-13T01:33:43.227 回答
1

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

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

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

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

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

希望这可以帮助。

干杯

于 2012-05-13T01:35:13.990 回答