关于简单客户端服务器套接字app的一些问

时间:2011-07-30 13:29:11

标签: java sockets synchronization client

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

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

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

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

    1. 如果我决定使用单独的线程进行接收,我还需要将客户端对象作为线程吗?或者我可以将客户端作为对象运行?我问这个是因为我注意到有些人将客户端对象作为线程运行。
    2. 我不太清楚为什么他们这样做,因为据我所知,当你创建一个对象和一个线程时,它们会同时运行(即像两个线程一样)。由于在这种情况下只涉及一个对象(客户端),因此它不应该作为线程运行,对吧?或者我错过了什么?

      1. 如果该方法是同步的,对象是否需要获取锁才能访问自己的方法?这是我的情况:
      2. 我的服务器是作为对象实现的。为每个客户端连接创建会话线程。每当会话线程收到客户端请求时,它都会调用服务器对象的handle()方法。 handle方法是同步的,并将返回信息发送给客户端。

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

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

        抱歉缺乏简洁,但我希望尽可能清楚。非常感谢解释和反馈。

        提前致谢。

1 个答案:

答案 0 :(得分:0)

发送&接收工作正常,因为您正在使用swing应用程序。一个摇摆应用程序作为一个线程&所执行的任何操作都是EventListener线程的一部分(虽然我不太确定该线程的确切名称)..

你在线程中有一个while循环运行&每当用户想要向服务器发送内容时,它就会使用eventlistener线程来完成这项工作。那就是为什么你看不到程序滞后..

也可能是转移不是太大而不能占用时间。

如果你需要构建线程访问控制,你应该尝试阅读ReentrantLocks,这些类是JDK的一部分。我建议你阅读Java Concurrency在实践中对java线程有一个很好的理解。

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