Java套接字 - 需要帮助更好地理解它们

时间:2012-05-13 01:20:56

标签: java sockets networking client-server

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

  1. 如果我希望能够同时处理输入和输出到客户端,我该怎么办?等待,然后如果服务器切换到输入流并获得更改,然后切换回输出流?或者我可以同时运行输入和输出流吗?
  2. 让我们说服务器必须同时处理几个客户端。我必须为每个客户做一个套接字吗?你有什么建议可以处理这个问题?
  3. 让我们说客户想要更改当前套接字的IP地址或端口并连接到其他服务器。我会创建一个新的套接字,还是有某种方法来改变当前的套接字?
  4. 这是我的主要问题。如果我能理解得那么多,我很确定我可以自己弄清楚我需要的其余部分。

3 个答案:

答案 0 :(得分:6)

这是套接字的绝佳指南。它本身不是“Java套接字”,但我认为你会发现它非常有用:

Beej's Guide to Network Programming

回答你的问题:

  

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

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

  问:可以说服务器必须同时处理几个客户端。生病   必须为每个客户端设置套接​​字吗?

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

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

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

  

问:让我们说客户想要更改他们的IP地址或端口   当前套接字并连接到其他服务器。我会创造吗?   一个新的套接字,还是有某种方法来改变当前的套接字?

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

答案 1 :(得分:1)

  

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

这取决于您的协议,如果您的客户端启动连接,那么您的服务器会在转到输出流并发送内容之前等待输入。作为tcp连接或甚至使用文件的每个连接都有输入流和输出流。

  

2.-让我们说服务器必须同时处理几个客户端。我必须为每个客户做一个套接字吗?你会建议什么?   一个好方法来处理这个?

这有不同的策略,包括多线程,所以现在专注于streams.Or保持一个服务器一个客户端。

  

3.-让我们说客户想要更改当前套接字的IP地址或端口并连接到其他服务器。我愿意吗?   创建一个新的套接字,或者有什么方法可以改变当前的套接字?

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

答案 2 :(得分:1)

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

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

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

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

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

希望这有帮助。

干杯