【问题标题】:JavaEE object oriented networkingJavaEE 面向对象的网络
【发布时间】:2012-12-23 06:44:33
【问题描述】:

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

最后,如果我使用static 修饰符在客户端程序中创建我的Socket,那么通常只允许创建它的一个对象,所以如果客户端程序中Socket 上的Socket和服务器程序中的Socket一般不一样,指的是创建的对象,现在两个程序之间是否只有一个对象共享?

为了清楚起见,我不是在谈论多个客户端连接,我只是想了解客户端 Socket 连接到服务器 ServerSocket 的基本机制,并弄清楚我能做什么和不能通过那种联系来做,但是一旦我理解了它,我就可以自己尝试了。

我希望我没有想太多。提前感谢您的帮助:-)。

【问题讨论】:

  • 我删除了对 Java EE 的引用,并添加了一些段落中断。

标签: java sockets network-programming serversocket


【解决方案1】:

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

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

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

【讨论】:

  • 但是客户端程序没有连接。每个都通过服务器连接,我试图找出处理客户端之间通信的最佳位置。
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 对不起,我认为我在描述静态方面做得很差,例如,如果我在一个类中创建一个列表,然后创建几个对象,然后在创建该列表时将它们添加到构造函数中无论我从哪里引用它,都会有相同数量的对象,对吗?并且感谢这些 cmets 提供了非常丰富的信息,我知道这不是接受教育的地方,但也许你可以推荐一本好书?
  • 我不明白你在用你的例子说什么静态;你的句子格式不正确,我真的无法理解它。
  • 至于要阅读的内容,我认为您需要对网络进行扎实的介绍。您可以查看 Java 网络教程中的 All About Sockets 课程。一本好的 Java 入门书籍的网络部分也应该能起到作用——当我阅读它时,我喜欢 Just Java,但那是十多年前的事了!
  • 哇,对不起。我在午休时间把它贴在我的手机上,让我再试一次。既然你提到了它,我只是想确保我对静态有正确的理解。如果我在包含 Foo 对象的 Foo 类中创建一个 static List 并在创建对象时将每个对象从 Foo 类的构造函数添加到 List ,那么将只有一个该 List 的副本它将包含添加到其中的所有对象。对吗?
  • 就介绍性书籍而言,24 小时内学习 Java 和 21 天内学习 Java 都是很棒的最新书籍,也许我需要重新阅读它们,但我不记得这两本书都涵盖了很多关于网络的事情。
猜你喜欢
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
相关资源
最近更新 更多