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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

想让服务端处理多个客户端的请求,最好将每个客户端封装到单独的线程中。
只要明确客户端要执行的服务端代码即可,这些代码放入run方法中。

//定义线程
class picThread implements Runnable
{
        private Socket s;
        picThread(Socket s){
                this.s=s;
        }
        public vodi run(){
                try{
                        inputStream in = s.getInputStream();
       
                        FileOutputStream os = new FileOutputStrem("conten.txt");

                        byte[] but = new byte[1024];
                        String len = null;
                        while((len=in.readLine(but))!=-1){
                                os.write(data,0,len);
                        }
                        os.close();
                        s.close();       
                }catch(Exception e){
                        theow new RuntimeException("失败");
                }
        }
}

//服务端,循环获取客户端,并循环建立线程
class picServer{
        public static void main(String[] args)throws Exception{

                ServerScoket service = new SercerSocket(端口);

                while(true){
                        Socket s = ss.sccept();
                        new Thread(new PicThread(s)).start();
                }
        }
       
}
这样,当a客户访问服务端的时候会new一个线程给a客户执行,b客户进来时,又new一个线程给b客户执行
这样就成功实现了客户端并发请求。

9 个回复

倒序浏览
楼主啊,         String len = null; 这是啥意思呢? 然后你又     while((len=in.readLine(but))!=-1){
len 应该是整形, int len = 0 ;吧! 而且in.readLine() 也没有这个方法啊,readLine()是BufferedReader类的方法吧。
   public vodi run(){    是void不是vodi   。。。
回复 使用道具 举报
徐慧书 发表于 2012-5-5 20:28
楼主啊,         String len = null; 这是啥意思呢? 然后你又     while((len=in.readLine(but))!=-1){
l ...

阁下真厉害,手写的,些错了,不好意思
应该是
int len = 0;
while((len=in.read(but))!=-1){
       os.write(data,0,len);
}
回复 使用道具 举报
嗯,但是访问量过多也会引起问题。
同时访问量过多会使得服务器大部分资源得不到释放,造成负载过大甚至崩溃。
DDoS攻击利用的就是这一个原理。说起来算是一个隐蔽的漏洞,别人可以利用访问过载使得别的客户端无法访问,形成对服务器的恶意攻击。
因此为了安全,应该在ServerSocket初始化的时候限制访问队列的长度,使得访问数量有限。

个人理解而已,希望能补充楼主的设计思想。有错也请指出,互相学习。
回复 使用道具 举报
大家来找茬,帮忙找找,还有木有写错的地方。
谢啦。。。
就当锻炼自己的能力吧,嘻嘻!!!
回复 使用道具 举报
谭景宾 发表于 2012-5-5 20:38
大家来找茬,帮忙找找,还有木有写错的地方。
谢啦。。。
就当锻炼自己的能力吧,嘻嘻!!! ...

哥们,够呛复制到Eclipse中,太多错误了,,您可以继续慢慢找找
回复 使用道具 举报
徐慧书 发表于 2012-5-5 20:44
哥们,够呛复制到Eclipse中,太多错误了,,您可以继续慢慢找找

好吧,多想哥们。
回复 使用道具 举报
谭景宾 发表于 2012-5-5 20:38
大家来找茬,帮忙找找,还有木有写错的地方。
谢啦。。。
就当锻炼自己的能力吧,嘻嘻!!! ...

编程的错误,希望是自己找比较好,只有自己知道自己曾经怎么犯错,才有利于下一次更好的修正。
希望楼主好好修炼,终成正果进入黑马,呵呵
回复 使用道具 举报
更正下代码...已经找错误了。
import java.net.*;
import java.util.*;
import java.io.*;
class picThread implements Runnable
{
        private Socket s;
        picThread(Socket s){
                this.s=s;
        }
        public void run(){
                try{
                        InputStream in = s.getInputStream();
       
                        FileOutputStream os = new FileOutputStream("conten.txt");

                        byte[] but = new byte[1024];
                        int len = 0;
                        while((len=in.read(but))!=-1){
                                os.write(but,0,len);
                        }
                        os.close();
                        s.close();       
                }catch(Exception e){
                        throw new RuntimeException("失败");
                }
        }
}

//服务端,循环获取客户端,并循环建立线程
class picServer{
        public static void main(String[] args)throws Exception{

                ServerSocket service = new ServerSocket(10001);

                while(true){
                        Socket s = service.accept();
                        new Thread(new picThread(s)).start();
                }
        }
       
}
回复 使用道具 举报
云惟桉 发表于 2012-5-5 20:35
嗯,但是访问量过多也会引起问题。
同时访问量过多会使得服务器大部分资源得不到释放,造成负载过大甚至崩 ...

嗯嗯,多谢兄台了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马