关于多线程和服务器

来源:互联网 发布:优化蜜蜡是假的吗 编辑:程序博客网 时间:2024/05/18 01:36
先说说多用户执行情况:
1、用户A申请连接服务器
2、用户A和服务器分别获得SocketA1,SocketA2
3、服务器端:存储PrintWriterA进入公共ArrayList 
4、新建线程A
5、线程A建立BufferedReader A
6、从ArrayList调用WriterA、WritterB,分别向这两个输出串写入字符串

注意点:
1、SocketA.BufferedReader和SocketB.
.BufferedReader是完全不同的!
2、当用户B建立线程时,会建立一个独立的线程B。刚刚的线程A依旧在运行,线程B和A会分别、独立地运行。
3、BuffererdReader 必须是线程局部变量,放于run()内部。因为线程均可使用公共变量,则在运行线程B时,
BuffererReader A会被覆盖为BufferedReader B。 

 
import java.net.ServerSocket;
import java.net.Socket;
import java.io.*;
import java.util.*;
public class Server {
    ServerSocket Ser;
    Socket Sock;
    PrintWriter Writer;
    ArrayList mess=new ArrayList();
    //BufferedReader reader;  this reader will be cover by the next Client
    public static void main(String [] args){
        new Server().go();
    }
   
    public void go(){
        try{
            Ser=new ServerSocket(2015);
            while(true){
                Sock=Ser.accept();
                Writer=new PrintWriter(Sock.getOutputStream());
                System.out.println("Ser!!!!!!!!!!!!!!");
                mess.add(Writer);
                Thread thread=new Thread(new Task());
                thread.start();
            }
        }catch(Exception e){
            System.out.println("error: Server set socket");
        }
    }
    
    public class Task implements Runnable{
        public void run(){
            String message;
                 try {//reader
                    //this is right each Thread has theri own BufferedReader
                    BufferedReader reader=new BufferedReader(new InputStreamReader(Sock.getInputStream()));
                    while((message=reader.readLine())!=null){
                        //
                        Iterator it = mess.iterator();
                          while(it.hasNext()) {
                               PrintWriter writer = (PrintWriter) it.next();
                               writer.println(message);
                               writer.flush();
                             }//while it
                          }//while me
                             } catch(Exception ex) {
                                 System.out.println("error: Writer and reader");
                             }
                          
            }//while try
        }//while run
}

0 0
原创粉丝点击