黑马程序员技术交流社区
标题:
[已解决]多线程上传图片
[打印本页]
作者:
黑马-李勇
时间:
2012-6-26 17:16
标题:
[已解决]多线程上传图片
本帖最后由 黑马-李勇 于 2012-6-26 17:42 编辑
第24天02网络编程Tcp客户端并发上传图片
class PicServer
{
public static void main(String[] args) throws Exception
{
ServerSocket ss=new ServerSocket(10007);
while(true)
{
Socket s=ss.accept();//这里为什么不能把这一句也放到线程中
new Thread(new PicThread(s)).start();
}
}
}
作者:
车风波
时间:
2012-6-26 17:20
accept()是一个阻塞方法,接收到客户端的请求后才会继续执行下面的new Thread()来创建线程,
如果把accept()放到run()里面就成了
while(true)
{
new Thread(new PicThread(s)).start();
}
这样就死循环了。因为while()是在主线程里,new Thread()创建好后run()的accept()并不能阻塞。
作者:
黑马-李勇
时间:
2012-6-26 17:31
哦,但这里只有一个s,第二个用户也是s第三个也是.....怎么区分啊?
作者:
周兴中
时间:
2012-6-26 17:35
如果将 Socket s=ss.accept();放到线程中, 那么ServerSocket ss=new ServerSocket(10007);这句也只能放到线程中,这样你的程序将变成单线程.
如果同时开启多个线程,那么ServerSocket ss=new ServerSocket(10007);将会执行多次,会报错,Address already in use: JVM_Bind 该地址已使用.
当A客户端连接上以后。被服务端获取到。服务端执行具体流程。
这时B客户端连接,只有等待。
因为服务端还没有处理完A客户端的请求,还有循环回来执行下次accept方法。所以
暂时获取不到B客户端对象。
那么为了可以让多个客户端同时并发访问服务端。
那么服务端最好就是将每个客户端封装到一个单独的线程中,这样,就可以同时处理多个客户端请求。
作者:
黑马-李勇
时间:
2012-6-26 17:36
哦,我明白了,是客户端的s。找到了23天11课,里面有客户的信息。可以理解成A的s,B的S。谢谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2