2012-05-13 31 views
1

好了,所以我在现场了Oracal在本网站的一些问题围绕阅读。我仍然很难理解套接字的一些事情,所以我会看看这里有没有人可以花时间向我缓慢的大脑解释它。我正在做的是建立一个聊天客户端和聊天服务器(要一举学习秋千和套接字)。尽管我见过所有的例子,但我仍然不清楚他们的工作方式。我知道如何使用输入流和带有输出流的1个套接字来运行1个套接字,但除此之外,我无法理解,因为这是我找到的大多数资源解释。这是我关于这个问题的一系列问题。的Java套接字 - 需要帮助理解他们更好地

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

这是我的主要问题。如果我能够理解这一点,我很确定我可以自己找出剩下的需要。

回答

6

这里有一个很好的指导插座。这不是“Java的插座”本身,但我认为你会发现它非常有用:

Beej's Guide to Network Programming

回答您的问题:

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

答:你没有做什么特别的。套接字自动“双模态”:您可以随时阅读(如果有任何数据)或写入。

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

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

每一个新的连接是一个新的socket。

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

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

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

+0

(我会阅读)谢谢!这真的帮助我理解。我发现的一切都告诉我如何在Java中设置一个套接字,并没有真正解释它们是如何工作的。 – cgasser

1

1.-如果我想能够在同一时间处理输入和输出到客户端,我会做什么?等待,然后如果 服务器切换到输入流并获取更改,然后切换 回到输出流?或者我可以在 上同时运行一次输入和输出流?

它取决于你的协议,如果你的客户端开始连接,那么你的服务器在输出流之前等待输入并发送一些内容。每个连接,作为tcp连接,甚至是文件处理都有一个输入流和一个输出流。

2.-比方说服务器必须一次处理多个客户端。我必须为每个客户端创建一个套接字吗?你会建议什么是 处理这个好方法?

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

3.-比方说,客户端想改变他们当前套接字的IP地址或端口,并连接到不同的服务器。我只是 创建一个新的套接字,还是有一些方法来改变当前的?

是,插座的定义是通过特定端口的IP地址做是否有这些的改变,你需要一个新的套接字连接。

1

我会试着尽我所能在这里,但我真的不认为这是针对这类问题的地方:

首先,你要明白,套接字的抽象底层操作系统套接字(unix套接字,win袜子等)。

这类插座是模型中的传输层的面向连接的服务(看OSI模型)。所以这意味着套接字为客户提供了一个来自客户端的字节流和一串字节流到客户端,所以要回答你的第一个问题,这些流是独立的。当然,您对通过这些流发言的协议的设计负责。

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

要回答你的第三个问题,连接主机之间进行的,所以如果你需要改变其中任何一个,就会有创建一个新的连接的需求。

希望这会有所帮助。

干杯

+0

一个端口不是一个进程号。积压与可处理的连接数量无关。你所写的都不意味着你每个连接都需要一个新的线程。 – EJP

+0

我认为你在这里变得太严格了,我不是说过程编号= PID,我只是说一个代表正在监听数据的过程的数字。你不需要每个连接的线程,但这是处理多个客户端时的一种常见方式,当时我正试图使其更具说教性而不是先进性。 –

+0

我不同意。我会说你在这里变得过于sl especially,特别是如果你想要成为'教诲'。当你说'进程号码'时,读者将不可避免地想到PID,而港口首先不是一个过程。你的回答清楚地表明'对于任何传入的连接你必须创建一个新的线程'。你不这样做,事先“如此”甚至没有意义。你可以随时编辑它。 – EJP