java - 关于简单客户端服务器套接字应用程序的一些问题

标签 java sockets synchronization client

我正在使用套接字编写一个简单的多线程客户端-服务器应用程序,并且有几个问题:

  1. 对于客户端来说,真的有必要使用单独的线程来从服务器接收数据吗?

我发现许多资源使用客户端对象将数据(使用 dataOutputStream)发送到服务器,同时使用单个线程专门从服务器接收数据(使用 dataInputStream)。据推测,这是因为 I/O 流本质上是阻塞的,因此单个执行线程在等待服务器消息时不应该能够发送数据(或执行其他任何操作),因为程序会被阻塞,直到收到某些内容。

但是,我编写的客户端可以在不使用单独线程的情况下进行发送和接收。接收数据的代码(即socket.readUTF())被放入while循环中,发送数据的代码(即socket.writeUTF())位于actionPerformed()方法中(当用户单击按钮时触发) )。据我所知,当用户什么也没做时,程序执行仍然在 while 循环中,监听服务器消息。当用户单击按钮时,会触发 actionPerformed() 方法,“中断”while 循环并发送消息。完成后,程序返回聆听。发送和接收工作完美。

为什么人们要使用单独的线程?

  1. 如果我决定使用单独的线程进行接收,是否也需要将客户端对象设置为线程?或者我可以将客户端作为对象运行吗?我问这个问题是因为我注意到有些人将客户端对象作为线程运行。

我不太清楚他们为什么这样做,因为据我所知,当您创建一个对象和一个线程时,它们会同时运行(即就像两个线程一样)。由于这种情况下只涉及一个对象(客户端),因此它不需要作为线程运行,对吧?或者我错过了什么?

  1. 如果该方法是同步的,对象是否需要获取锁才能访问自己的方法?这是我的情况:

我的服务器是作为一个对象实现的。为每个客户端连接创建 session 线程。每个 session 线程每当收到客户端请求时都会调用服务器对象的handle()方法。该handle方法是同步的,并向客户端发送返回信息。

除了handle()方法之外,服务器还有一些其他方法向每个客户端发送信息。这些方法可以随时通过服务器的 GUI 调用(它们不是由 session 线程调用)。当handle()方法运行时,我不希望这些其他方法运行,因为它们可能会干扰handle()并弄乱发送协议(protocol)。换句话说,我希望在运行其他方法之前完成句柄方法。

我可以使这些方法同步,以防止服务器对象在句柄方法运行时调用它们,反之亦然吗?理论上,服务器对象需要等待句柄的锁被释放,然后才能调用它们。我只是不确定对象(不是线程)是否需要获取其自己的同步方法上的锁才能访问它。这就是我的问题。

很抱歉不够简洁,但我想尽可能清楚。非常感谢您的解释和反馈。

提前致谢。

最佳答案

发送和接收工作正常,因为您使用的是 swing 应用程序。 swing 应用程序作为线程启动,执行的任何操作都是 EventListener 线程的一部分(不过我不太确定线程的确切名称)..

您在线程中运行了一个 while 循环,每当用户想要向服务器发送某些内容时,它就会使用事件监听器线程来完成这项工作。这就是为什么您看不到程序滞后的原因。

也可能是传输量不太大而占用时间。

如果您需要构建线程访问控制,您应该尝试阅读有关ReentrantLocks的内容,这些类是 JDK 的一部分。我建议您阅读《Java 并发实践》,以更好地了解 Java 线程。

一些可以帮助您解决此问题的链接 1.ReentrantLocks 2.Java Concurrency in Practice

关于java - 关于简单客户端服务器套接字应用程序的一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6883400/

相关文章:

重用套接字时 C# TCP Socket.Receive 问题

c++ - 继承自 boost::asio::ip::tcp::socket 的自定义套接字

android - 使用同步适配器远程删除/锁定设备 : Android

php - 如何将 iPhone 联系人与数据库同步?

java - 当设备处于 sleep 状态时在后台运行广播接收器?

java - 在用户拖动鼠标时收听 JFrame 调整大小事件?

java - 该方法对于错误类型不明确

C:函数的隐式声明

java - 我如何允许用户使用 JComboBox 更改他在 JTextPane 中的字体?

ios - 使用 Microsoft Azure MobileService 同步多个表