0

我想澄清一下网络 OOP。例如,使用客户端-服务器模型,如信使,您有两个程序。当客户端程序运行时,它的一个对象被实例化。然后在客户端程序中实例化A并使用'方法Socket连接到服务器程序。根据在服务器程序内部创建新的文档。根据我的经验,在 Java 中使用 create 这个词时,它指的是一个对象,所以现在一个客户端有两个对象吗?一个在客户端程序上,一个在服务器上?是否可以从服务器程序或其他方式实例化客户端程序中的对象?ServerSocketServerSocketaccept()SocketSocket

最后,如果我通常使用static修饰符在客户端程序中创建我Socket的,那将只允许创建它的一个对象,因此如果客户端程序中的SocketonSocket通常Socket与服务器程序中的不同,则指的是对象创建后,现在两个程序之间是否只有一个对象共享?

为了清楚起见,我不是在谈论多个客户端连接,我只是想了解客户端Socket与服务器连接的基本机制,ServerSocket并弄清楚我可以通过该连接做什么和不能做什么,但一旦我理解我可以在自己的时间进行实验。

我希望我没有想太多。在此先感谢您的帮助 :-)。

4

2 回答 2

1

首先,是的,您绝对正确,您最终会Socket为同一连接获得两个对象,一个在客户端程序中,一个在服务器中。但是,将这些视为“相同”对象是错误的。在普通语言中,“套接字”是连接插入某物的地方。两个事物之间的连接有两个套接字,每端一个。网络Socket也是一样的——客户端程序中有一个,服务器程序中有一个。

你也有ServerSocketin server 程序,但那是完全不同的东西。那不是真正的插座,它是一种制造插座的设备。在最初的 Berkeley 套接字 API 中,这被建模为一种套接字(错误地如此?),因此它在 Java 中被相应地命名。

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

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

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

于 2012-12-23T11:59:51.617 回答
1

首先,您的问题与 Java EE 无关。套接字是 Java SE 的一部分。

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

我不明白您为什么如此关心创建的套接字对象的数量。套接字就是这样:两方之间通信的端点。每一方都有自己的端点,连接到另一方的端点。有点像给朋友打电话:你用一部手机,你的朋友也用一部,两部手机是连在一起的。

于 2012-12-23T10:15:57.100 回答