A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-李勇 中级黑马   /  2012-6-26 17:16  /  3069 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马-李勇 于 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();
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
accept()是一个阻塞方法,接收到客户端的请求后才会继续执行下面的new Thread()来创建线程,
如果把accept()放到run()里面就成了
while(true)
                 {
            new Thread(new PicThread(s)).start();
                 }
这样就死循环了。因为while()是在主线程里,new Thread()创建好后run()的accept()并不能阻塞。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
哦,但这里只有一个s,第二个用户也是s第三个也是.....怎么区分啊?
回复 使用道具 举报
如果将   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客户端对象。

那么为了可以让多个客户端同时并发访问服务端。
那么服务端最好就是将每个客户端封装到一个单独的线程中,这样,就可以同时处理多个客户端请求。
回复 使用道具 举报
哦,我明白了,是客户端的s。找到了23天11课,里面有客户的信息。可以理解成A的s,B的S。谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马