package xs;

/****************************************************************
*	Version		:	1.0
*	Date		:	02/03/2007
*	
*	Description
*	This is a Server Side application of Chat System.
*	This application is used for receiving the messages from any client
*	and send to each and every client and in this we can maintain the
*	list of all online users.
*
*	Remarks
*	This application is unable to provide the private chatting facility
******************************************************************/

import java.io.*;
import java.net.*;
import java.util.*;

public class MyServer{
	ServerSocket ss;
	Socket s;
	ArrayList al=new ArrayList();
	ArrayList al1=new ArrayList();
	ArrayList al2=new ArrayList();
	ArrayList alname=new ArrayList();
	Socket s1,s2;
	MyServer()throws IOException{
		ss=new ServerSocket(1004);	// create server socket
		while(true){
			s=ss.accept();	//accept the client socket
			s1=ss.accept();
			s2=ss.accept();
			al.add(s);	// add the client socket in arraylist
			al1.add(s1);
			al2.add(s2);
			System.out.println("Client is Connected");
			MyThread2 m=new MyThread2(s2,al2,alname); //new thread for maintaning the list of user name
			Thread t2=new Thread(m);
			t2.start();

			MyThread r=new MyThread(s,al);//new thread for receive and sending the messages
			Thread t=new Thread(r);
			t.start();
			
			MyThread1 my=new MyThread1(s1,al1,s,s2); // new thread for update the list of user name
			Thread t1=new Thread(my);
			t1.start();
		}
	}
	public static void main(String[] args){
		try{
			new MyServer();			
		}catch (IOException e){}
	}
}
//class is used to update the list of user name
class MyThread1 implements Runnable{
	Socket s1,s,s2;
	static ArrayList al1;
	DataInputStream ddin;
	String sname;
	MyThread1(Socket s1,ArrayList al1,Socket s,Socket s2){
		this.s1=s1;
		this.al1=al1;
		this.s=s;
		this.s2=s2;
	}
	public void run(){	
		try{
		ddin=new DataInputStream(s1.getInputStream());
		while(true){
		sname=ddin.readUTF();
		System.out.println("Exit  :"+sname);
		MyThread2.alname.remove(sname);//remove the logout user name from arraylist
		MyThread2.every();
		al1.remove(s1);
		MyThread.al.remove(s);
		MyThread2.al2.remove(s2);
		if(al1.isEmpty())
			System.exit(0); //all client has been logout
		}
		}catch(Exception ie){}
	}
}

// class is used to maintain the list of all online users
class MyThread2 implements Runnable{
	Socket s2;
	static ArrayList al2;
	static ArrayList alname;
	static DataInputStream din1;	
	static DataOutputStream dout1;

	MyThread2(Socket s2,ArrayList al2,ArrayList alname){
		this.s2=s2;
		this.al2=al2;
		this.alname=alname;
	}
	public void run(){
		try{
		din1= new DataInputStream(s2.getInputStream());
		alname.add(din1.readUTF());	// store the user name in arraylist
		every();
		}catch(Exception oe){System.out.println("Main expression"+oe);}
	}
	// send the list of user name to all client
	static void every()throws Exception{
		Iterator i1=al2.iterator();
		Socket st1;		

		while(i1.hasNext()){
			st1=(Socket)i1.next();
			dout1=new DataOutputStream(st1.getOutputStream());
			ObjectOutputStream obj=new ObjectOutputStream(dout1);
			obj.writeObject(alname); //write the list of users in stream of all clients
			dout1.flush();
			obj.flush();
		}
	}
}
//class is used to receive the message and send it to all clients
class MyThread implements Runnable{
	Socket s;
	static ArrayList al;
	DataInputStream din;
	DataOutputStream dout;

	MyThread(Socket s, ArrayList al){
		this.s=s;
		this.al=al;
	}
	public void run(){
		String str;
		int i=1;
		try{
		din=new DataInputStream(s.getInputStream());
		}catch(Exception e){}
		
		while(i==1){
				try{
					
					str=din.readUTF(); //read the message
					distribute(str);
				}catch (IOException e){}
			}
	}
	// send it to all clients
	public void distribute(String str)throws IOException{
		Iterator i=al.iterator();
		Socket st;
		while(i.hasNext()){
			st=(Socket)i.next();
			dout=new DataOutputStream(st.getOutputStream());
			dout.writeUTF(str);
			dout.flush();
		}
	}
}
最近下载更多
794860639  LV1 2023年10月7日
caomin  LV4 2023年5月19日
kk1226  LV2 2022年12月30日
106sadadwd  LV2 2022年6月18日
Demo1111  LV30 2021年12月9日
胡萝北呀  LV3 2021年11月26日
顾北城  LV12 2021年11月21日
ComeDebug  LV6 2021年9月6日
Count count count  LV1 2021年7月9日
tyuthnw123  LV2 2021年6月22日
最近浏览更多
zeng1206  LV5 2023年12月28日
暂无贡献等级
794860639  LV1 2023年10月7日
KAIzx11  LV7 2023年6月25日
17683946472  LV9 2023年6月8日
caomin  LV4 2023年5月19日
微信网友_6444139264921600  LV6 2023年4月29日
青柠编程  LV13 2023年4月21日
内心向阳  LV4 2023年3月30日
臧家旺  LV3 2023年3月23日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友