如何用Java设计线程化UDP客户端/服务器?

时间:2011-06-03 12:40:13

标签: java multithreading udp

我只是在寻找程序设计的一些见解,因为我对线程没有经验。

目前正在编写一个小客户端。您可以指定该客户端是“服务器”还是“客户端”,它将以正确的方式创建协议。

我在他们之间做了一点握手(syn,ack,synack等等),然后启动网络线程。

我有主线程,有一个无限的while循环并做两件事。

  1. 向“toSend”队列添加消息。
  2. 从“已接收”队列中提取所有消息并打印出来。
  3. 网络线程有一个无限的while循环,可以完成两件事。

    1. 从“toSend”队列中拉出所有消息并发送它们。
    2. 向“已接收”队列(已获取)添加消息。
    3. 队列目前为ArrayBlockingQueue<String>(1000)

      我的问题如下:

      这是一个良好的网络线程设计吗?我需要处理任何陷阱吗?

      目前我遇到了一个问题,其中一个线程(主线程)正在填充“toSend”队列,甚至在网络线程有机会发送一条消息之前。我通过让主线程做一些阻塞(I / O)的工作来“处理”这个。

4 个答案:

答案 0 :(得分:4)

您似乎正在重新发明轮子并且正在努力解决其他人已经解决的问题(并且最有可能使用优化的解决方案),请先查看Netty

  

Netty项目致力于提供异步事件驱动的网络应用程序框架和工具,以便快速开发可维护的高性能和高可用性。高可扩展性协议服务器&amp;客户端。

广播UDP / IP客户端和服务器有一个例子。

答案 1 :(得分:1)

我个人认为处理UDP网络最好使用单线程,事件驱动的编程风格,而不是使用线程。无论如何它都是无状态的,所以尝试跟踪线程中的状态毫无意义。

超时很容易通过计时器向事件队列添加事件来处理。

这有效地避开了所有同步问题。

答案 2 :(得分:1)

我已经在UDP / TCP实时系统上工作了4年多。 你的问题很有道理。在我看来,Netty框架是一个很好的方法,但有点沉重。

我使用的是您提到的完全相同的设计,并且到目前为止没有看到任何问题。

此致

答案 3 :(得分:0)

'toSend'队列毫无意义。只需让所有人通过套接字直接发送。