繁体   English   中英

Java中的多线程服务器。线程提供文件

[英]Multithreaded server in java.. Threads serving files

因此,我正在编写一个多线程服务器,该服务器将输入服务器名称,端口,线程数和要请求的文件名作为输入。我的设计是通过main创建一个套接字,然后扩展一个Runnable对象(一个套接字和文件名)。我还有一个timertask,当5秒结束时将触发该任务,然后关闭并停止所有线程。.我当前的设计是在main中创建套接字,并将其传递给可运行的(其中有一个在条件x上进行while循环,一遍又一遍地请求文件),然后在任务启动时将runnable中的私有共享变量x设置为false。

我面临许多折断的管道问题,这使我相信我的设计存在缺陷。我是否缺少某些东西? 我没有使用同步/锁定变量。 我应该为每个文件请求创建一个新的套接字吗?

堆栈跟踪:

java.net.SocketException: Broken pipe
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:115)
    at java.io.DataOutputStream.writeBytes(DataOutputStream.java:259)
    at FR.filesRecv(Client.java:62)
    at FR.run(Client.java:79)
    at java.lang.Thread.run(Thread.java:637)

一些一般性的评论:

  • 是的,每个客户端都应该有自己的服务器套接字连接。
  • 在服务器端,有一个服务器套接字,但是当从客户端接受连接时,将为每个处理程序创建一个新的套接字,以与其对应的客户端进行通信。
  • 我会在main派生线程,然后休眠5秒钟,然后将runnable变量设置为false。 无需计时器任务。
  • 然后,如果希望JVM快速停止,则可以立即从main退出,也可以在每个线程上调用join()以确保它们正确完成。 您还可以设置thread.setDaemon(false); 在线程启动之前退出,然后退出main ,直到线程自己完成,JVM才会停止。
  • 如果要从另一个线程设置runnable变量,则需要确保该变量是volatile

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM