JavaEE面向对象的网络

时间:2012-12-23 06:44:33

标签: java sockets network-programming serversocket

我想澄清网络OOP。例如,使用客户端 - 服务器模型,如信使,您有两个程序。运行客户端程序时,会实例化其对象。然后在客户端程序中实例化Socket,并使用ServerSocket的{​​{1}}方法连接到服务器程序ServerSocket。根据在服务器程序中创建新accept()的文档。根据我的经验,任何时候在Java中使用create这个词指的是一个对象,那么现在有两个对象用于一个客户Socket?一个在客户端程序上,一个在服务器上?是否可以从服务器程序中实例化客户端程序中的对象,反之亦然?

最后,如果我使用Socket修饰符在客户端程序中创建我的static,通常只允许创建一个对象,如果Socket在{客户端程序中的{1}}通常与服务器程序中的Socket不同,引用创建的对象,现在只有一个对象在两个程序之间共享?

为了明确我不是在谈论多个客户端连接,我只是想了解客户端Socket与服务器Socket的连接的基本机制以及弄清楚通过这种联系我能做什么,不能做什么但是一旦我明白了,我就可以按照自己的时间进行实验。

我希望我不要这么想。在此先感谢您的帮助: - )。

2 个答案:

答案 0 :(得分:1)

首先,您的问题与Java EE没有任何关系。套接字是Java SE的一部分。

您也不明白static的含义。 static将变量范围限定为类,而不是将其作用于类的实例。它不限制创建的对象数。每个JVM都有自己的对象和类,这些对象和类不通过网络与任何其他JVM共享。在客户端JVM中将对象存储到A类的静态变量foo中不会对服务器上A.foo中存储的内容产生任何影响。

我不明白为什么你这么关心创建的套接字对象的数量。套接字只是:双方之间通信的端点。每一方都有自己的端点,连接到另一方的端点。有点像给朋友打电话的时候:你使用的是手机,而你的朋友也使用了一部,而且这两部手机相互连接。

答案 1 :(得分:1)

首先,是的,你绝对正确的是你最终得到两个Socket对象用于同一个连接,一个在客户端程序中,一个在服务器中。但是,将这些视为“相同”的对象是错误的。在普通语言中,'socket'是连接插入某些东西的地方;两件事之间的连接有两个插座,每端一个。网络Socket是一样的 - 您在客户端程序中有一个,在服务器程序中有一个。

您在服务器程序中也有ServerSocket,但这是完全不同的。那不是套接字,它是一个用于制作套接字的设备。在最初的Berkeley套接字API中,这被建模为一种套接字(错误地如此?),因此它在Java中相应地命名。

您询问服务器程序是否可以在客户端程序中创建对象。您暗示带有套接字的业务是客户端在服务器程序中创建对象的示例。这些都不是这样的。服务器程序中的Socket完全由服务器代码创建。

现在,有一个名为serialization的东西,它允许您在一个程序中获取对象,将它们编码为使用套接字通过网络发送的字节,然后在另一端从这些字节重新构建新对象。这不允许一个程序远程操作另一个程序,并且它不会同时创建两个程序中的对象,但它确实让两个合作程序将对象从一个程序复制到另一个程序。

对于static,是的,正如JB所说,你误解了这一点。如果你声明一个变量static,这意味着它属于它声明的类,而不是它声明的类的实例,所以在该程序中只有一个变量副本,而不是每个班级的实例。但是,它对程序没有影响。不同的程序具有完全独立的变量Universe,因此每个程序都有自己的static变量副本。