分享一个从国外网站看到的socket程序,程序并不强悍,但能从代码中看到老外是怎么写代码的,咱可以取长补短

原文:分享一个从国外网站看到的socket程序,程序并不强悍,但能从代码中看到老外是怎么写代码的,咱可以取长补短

源代码下载地址:http://www.zuidaima.com/share/1550463702764544.htm

package com.zuidaima.xs;

/****************************************************************
*	Version		:	1.0
*	Date		:	02/03/2007
*       Author          :       www.zuidaima.com
*	
*	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();
		}
	}
}

	    			


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。