当前位置:编程学习 > JAVA >>

【100分】java 服务器开发Socket 多线程的问题


Socket socket = server.accept();
new Thread()
{
    ...处理socket的请求相关
}.start();


我想每个请求就开一个线程, 请问一下这个在实际使用中会不会遇到啥问题??

或者有没有更好的解决方案,谢谢大家啊~~ --------------------编程问答-------------------- 若请求量比较高的话,你的内存一下子就耗完了 --------------------编程问答-------------------- 没有问题的,一般是这样处理的,要注意的是结束通信的时候要关闭socket。 --------------------编程问答-------------------- 如果并发小没问题,并发数多了就崩溃了

一般都使用异步io来做,有现成的框架,比如:netty。 --------------------编程问答--------------------
引用 3 楼 goldenfish1919 的回复:
如果并发小没问题,并发数多了就崩溃了

一般都使用异步io来做,有现成的框架,比如:netty。


请问一下, 这样每一个在线的用户, 都会消耗一个thread 。  一般服务器能抗住多少用户?

不知道有没有相关经验可以分享一下呢 --------------------编程问答-------------------- 整个还要置于可控循环中,如果是为了持续接受连接的话。
ServerSocket再设置一下超时以便长时无连接情况下退出。 --------------------编程问答--------------------
引用 楼主 ID19870510 的回复:
Java code
?



123456

Socket socket = server.accept(); new Thread() {     ...处理socket的请求相关 }.start();

我想每个请求就开一个线程, 请问一下这个在实际使用中会不会遇到啥问题??

或者有没有更好的解决方案,谢谢大家啊~~

上个月做了个多线程网络聊天程序 可以给楼主点建议  觉得这样好些
 new Thread() {  Socket socket = server.accept();
   ...处理socket的请求相关 }.start(); ,因为new一个新线程服务器端就accept();然后只要及时调用close()就OK 不然线程太多很占内存 我们是在自己的电脑模拟的服务器和客户端 所以那点内存是不够的,不用担心这个问题
--------------------编程问答--------------------
引用 6 楼 zuo_jin 的回复:
Quote: 引用 楼主 ID19870510 的回复:

Java code
?



123456

Socket socket = server.accept(); new Thread() {     ...处理socket的请求相关 }.start();

我想每个请求就开一个线程, 请问一下这个在实际使用中会不会遇到啥问题??

或者有没有更好的解决方案,谢谢大家啊~~

上个月做了个多线程网络聊天程序 可以给楼主点建议  觉得这样好些
 new Thread() {  Socket socket = server.accept();
   ...处理socket的请求相关 }.start(); ,因为new一个新线程服务器端就accept();然后只要及时调用close()就OK 不然线程太多很占内存 我们是在自己的电脑模拟的服务器和客户端 所以那点内存是不够的,不用担心这个问题


你这样写。是只在一个线程里面做吗?
--------------------编程问答-------------------- 感觉实现runnable接口要比这个效果好。 --------------------编程问答--------------------
引用 7 楼 ID19870510 的回复:
Quote: 引用 6 楼 zuo_jin 的回复:

Quote: 引用 楼主 ID19870510 的回复:

Java code
?



123456

Socket socket = server.accept(); new Thread() {     ...处理socket的请求相关 }.start();

我想每个请求就开一个线程, 请问一下这个在实际使用中会不会遇到啥问题??

或者有没有更好的解决方案,谢谢大家啊~~

上个月做了个多线程网络聊天程序 可以给楼主点建议  觉得这样好些
 new Thread() {  Socket socket = server.accept();
   ...处理socket的请求相关 }.start(); ,因为new一个新线程服务器端就accept();然后只要及时调用close()就OK 不然线程太多很占内存 我们是在自己的电脑模拟的服务器和客户端 所以那点内存是不够的,不用担心这个问题


你这样写。是只在一个线程里面做吗?



对于服务器端可以给所有连接它的用户发送信息 然后 客户端与客户端之间的聊天也能通过服务器发送。。其实发送消息都在服务器,所有 服务器发送消息的方法要加锁synchronized。。。好吧 这好像歪楼了。。。



回到楼主问题  建了个类用来服务器端的等待客户端连接的线程类  还有服务器界面主类,监听客户端收发信息的线程类,这样基本对于服务器的要求满足了。。。对于每个连接的客户端都new一个新连接的线程 就够了。。。服务器端有专门的监听类就知道有哪些客户端连着。。。不知道楼主看懂我说的了没? --------------------编程问答--------------------
引用 9 楼 zuo_jin 的回复:
Quote: 引用 7 楼 ID19870510 的回复:

Quote: 引用 6 楼 zuo_jin 的回复:

Quote: 引用 楼主 ID19870510 的回复:

Java code
?



123456

Socket socket = server.accept(); new Thread() {     ...处理socket的请求相关 }.start();

我想每个请求就开一个线程, 请问一下这个在实际使用中会不会遇到啥问题??

或者有没有更好的解决方案,谢谢大家啊~~

上个月做了个多线程网络聊天程序 可以给楼主点建议  觉得这样好些
 new Thread() {  Socket socket = server.accept();
   ...处理socket的请求相关 }.start(); ,因为new一个新线程服务器端就accept();然后只要及时调用close()就OK 不然线程太多很占内存 我们是在自己的电脑模拟的服务器和客户端 所以那点内存是不够的,不用担心这个问题


你这样写。是只在一个线程里面做吗?



对于服务器端可以给所有连接它的用户发送信息 然后 客户端与客户端之间的聊天也能通过服务器发送。。其实发送消息都在服务器,所有 服务器发送消息的方法要加锁synchronized。。。好吧 这好像歪楼了。。。



回到楼主问题  建了个类用来服务器端的等待客户端连接的线程类  还有服务器界面主类,监听客户端收发信息的线程类,这样基本对于服务器的要求满足了。。。对于每个连接的客户端都new一个新连接的线程 就够了。。。服务器端有专门的监听类就知道有哪些客户端连着。。。不知道楼主看懂我说的了没?



对于每个连接的客户端都new一个新连接的线程 就够了

到头来还是得这样子搞啊。 --------------------编程问答-------------------- 开个线程监听请求,收到一个请求就开新开个子线程去处理 --------------------编程问答-------------------- 这种问题,有一个常用的解决方案,就是“线程池” Thread Pool Pattern.

概念上,可以去读 IBM 的这篇介绍:
线程池的介绍及简单实现 http://www.ibm.com/developerworks/cn/java/l-threadPool/

IBM 的这篇介绍使用的是 synchronization 的方法。但是Java SE 1.5 以后,可以直接用 java.util.concurrent.Executors 的函数 newFixedThreadPool():
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool(int)

J2EE 上的话,Web Application Server 都内部使用 thread pool. 应用在EJB container内不能自制线程. Socket 接口,一般要引入 connector. --------------------编程问答--------------------
引用 楼主 ID19870510 的回复:

Socket socket = server.accept();
new Thread()
{
    ...处理socket的请求相关
}.start();


我想每个请求就开一个线程, 请问一下这个在实际使用中会不会遇到啥问题??

或者有没有更好的解决方案,谢谢大家啊~~


这个要看你自己的业务需求了,如果是单个的业务开一个线程就够了,要是多个的话就这能来一个连接就开一个线程了,例如楼上说的一个类似QQ服务器的东西,他所作的就是转发每个客户端发来的信息就是做一件事情那么一个线程就好了,(楼上这种做法一般是用作群聊的)如果用上面的方法实现一对一聊天就可能出现延迟,那么就该开启多个线程来实现每个连接的业务。这样可能出现丢包的问题。 --------------------编程问答-------------------- 建议用线程池做处理 --------------------编程问答-------------------- 用线程池,然后再及时关闭连接。。。
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,