⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.java

📁 提供用户登陆
💻 JAVA
字号:
//Server.java
import java.io.*;
import java.net.*;
import java.util.*;
import MyPackage.VECTOR;

public class Server extends Thread{  
	protected int port;
	protected ServerSocket listen_socket;
	//定义并启动服务器的Socket 例程,监听客户机的连接请求。
	public Server(int port){
		this.port=port;
		try{
			listen_socket=new ServerSocket(port);
		}
		catch(IOException e){}
		System.out.println("(信息收发)Server port:listening on port:"+port);
		this.start();
		}// End of Server
		/* 下面为服务器监听线程的主程序。该线程一直循环执行,监听并接受客户机发出的连接
		  请求。对每一个连接,均产生一个连接对象与之对应,通过Socket 通道进行通信。*/
        public void run(){
			Socket socket;
			try{
				while(true){
				  //从容器中移除已断开连接的socket
				  for(int j=0;j<VECTOR.vector.size();j++){
					     A1 a=new A1();
					     a=(A1)(VECTOR.vector.get(j));
					    if(a.socket0.isClosed())//返回套接字的关闭状态
						    VECTOR.vector.remove(j);
				    }//end of for
				
					Socket client_socket=listen_socket.accept();
                    //System.out.println("第一次用户名:"+A2.zhh);
					A1 a1=new A1();
					a1.socket0=client_socket;
					a1.user=A2.zhh;
                    VECTOR.tp.add(a1);
                    VECTOR.vector.add(a1);
					//System.out.println("第二次用户名:"+a1.user);
					//System.out.println("输出SOCKET:"+a1.socket0);
					System.out.println("接立一个客户端传输连接");
					Connected c=new Connected(client_socket);
				}
			}
			catch(IOException e){}
		}// End of run
		//启动服务器主程序
		public static void main(String args[]){
			new Server(4700);//信息的收发端口
			new User(5700);//注册端口
			new Ascends(6700);//登陆端口
			new FileRead();//把用已注册的用户从文件中读出来
		}//End of the main	
}//end of Server class

class Connected extends Thread{
	protected Socket client;
	protected BufferedReader in;
	protected PrintStream out;
	public Connected(Socket client_socket){
		client=client_socket;
		try{
			in=new BufferedReader(new InputStreamReader(client.getInputStream()));
			out=new PrintStream(client.getOutputStream());
		}
		catch(IOException e){
			try{
				client.close();
			}
			catch(IOException e2){
				System.err.println("Exception while getting socket streram:"+e);
			}
			return;
		}
		this.start();
	}//End of Connection method
	// 服务例程:读出一行文本; 
	public void run(){
		String line,line1,user0,user,name;
		Socket c;
		int i,j,k;
		try{
			for(;;){
				line1=in.readLine();
				//System.out.println("原始数据:"+line1);
				if(line1==null)break; 
				line=line1.replace('♀','\n');//将字符串中的所有♀还原成回车符
				System.out.println("输出接收到的消息:"+line);
				               
				//从容器中移除已断开连接的socket
				//System.out.println(VECTOR.vector.size());
				for(j=0;j<VECTOR.vector.size();j++){
					A1 a=new A1();
					a=(A1)(VECTOR.vector.get(j));
					c=a.socket0;
					if(c.isClosed())//返回套接字的关闭状态
						VECTOR.vector.remove(j);
				}//end of for
				i=line.indexOf(60);//查找"<"的位置
				j=line.indexOf(62);//查找">"的位置
				k=line.lastIndexOf(62);//查找">"最后一次出现的位置
			//	System.out.println("i="+i+"j="+j);
             //   System.out.println(VECTOR.vector.size());
				user0=line.substring(0,j);//从消息队列中取出源用户
                user=line.substring(i+1,k);//从消息队列中取出目的用户
               // System.out.println("User0:"+user0);
				//System.out.println("User:"+user);
				System.out.println("当前私聊的用户数:"+VECTOR.temp.size());
				if(user.equals("Everybody")){//判断是私聊还是群聊
				    //判断私聊的用户是否已经取消私聊
					for(i=0;i<VECTOR.temp.size();i++){
						String a=(String)(VECTOR.temp.get(i));
						if(user0.equals(a))
							VECTOR.temp.remove(i);
					}

					for(i=0;i<VECTOR.vector.size();i++){
						boolean flag1=false;
						A1 a1=new A1();
						a1=(A1)(VECTOR.vector.get(i));
						c=a1.socket0;
					    
						//判断此用户是否在进行私聊
						for(j=0;j<VECTOR.temp.size();j++){
							String p=(String)VECTOR.temp.get(j);
							if(p.equals(a1.user)){
								flag1=true;
								break;
							}
						}
						if(flag1)
							continue;
						//判断程序段结束*/
						out=new PrintStream(c.getOutputStream());
						out.println(line);
						out.flush();
						
						}
				}
				else{
					boolean flag2=false;//标记当前用户是否在已经建立连接有用户的队列中
					for(i=0;i<VECTOR.vector.size();i++){
                        A1 a2=new A1();
						a2=(A1)(VECTOR.vector.get(i));
					    c=a2.socket0;
						if(user.equals(a2.user)){
							flag2=true;
							break;
						}
					}
					if(!flag2){
					    out.println("※♂℉〒á☆");
					}
					else{
						boolean flag3=true;//标记当前用户是否在私聊用户队列中true表示"不在",false表示"在"
						for(i=0;i<VECTOR.temp.size();i++){
							String tt=(String)VECTOR.temp.get(i);
							if(tt.equals(user0)){
								flag3=false;
								break;
								}
						}

						if(flag3)
							VECTOR.temp.add(user0);//加当前用户加到私聊队列中去
						for(i=0;i<VECTOR.vector.size();i++){
							A1 a1=new A1();
							a1=(A1)(VECTOR.vector.get(i));
							c=a1.socket0;
							name=a1.user;
							if(name.equals(user)||name.equals(user0)){
							out=new PrintStream(c.getOutputStream());
							out.println(line);
							out.flush();
							}
						}
					}
				}

			}
		}
		catch(IOException e){}
		finally{
			try{
				client.close();

				}
			catch(IOException e2){}
			System.out.println("此线程结束");
		}
	}//End of run method
}//End of connected class

//注册用户
class User extends Thread{
	BufferedReader is;
	PrintWriter os;
	ServerSocket s;
	Socket c;
	User(int port){
		try{
			s=new ServerSocket(port);
			System.out.println("(用户注册)Server port:listening on port:"+port);
		}catch(Exception e){
			System.out.println("shuermao"+e);
			return;
		}
		this.start();
		
	}
	public void run(){
        while(true){
		try{
			c=s.accept();
			System.out.println("用户注册建立一个新连接...");
			new conn(c);
		}catch(Exception e){}
		}
	}
}

class conn extends Thread{
	    BufferedReader is;
		PrintWriter os;
		Socket c;
	    public conn(Socket s){
			c=s;
			try{ 
			  os=new PrintWriter(c.getOutputStream());
			  is=new BufferedReader(new InputStreamReader(c.getInputStream()));
            }catch(Exception e){
				try{
					c.close();
				}catch(Exception e1){}
				return;
			}
			this.start();
		}

		public void run(){
			String s1,s2,s3,s4;
			int i,j,k;
			//System.out.println("flag");
            while(true){
				try{
					s1=is.readLine();
				//	System.out.println("MIJIANMEI!"+s1);
					if(s1==null)break;
					i=s1.indexOf(58);//返回":"第一次出现的位置
					j=s1.lastIndexOf(58);//返回":"最后一次出现的位置
					s2=s1.substring(0,i);//取出用户名
					s3=s1.substring(i+1,j);//取出密码
					s4=s1.substring(j+1,s1.length());//取出确认密码
	                Judge judge=new Judge();
					if(s2.length()<1|s2.length()>10|!judge.function1(s2)){
						System.out.println("用户名非法");
						new B(c,"2");
					}
					else if(!s3.equals(s4)|s3.length()<1|s3.length()>6|!judge.function2(s3)){
						System.out.println("密码非法");
						new B(c,"3");
					}
					else{
						for(j=0;j<VECTOR.user.size();j++){//判断此用户是否已经存在
						    A a=new A();
							a=(A)(VECTOR.user.get(j));
							if(s2.equals(a.name)){
						//		System.out.println("name="+a.name+" S2="+s2);
								System.out.println("此用户已经存在");
								new B(c,"1");
								break;
								}
							}
							if(j==VECTOR.user.size()){//此用户已经存在
							    A arr=new A();
								arr.name=s2;
								arr.key=s3;
								new FileWrite(s2+":"+s3);
								VECTOR.user.add(arr);
								new B(c,"0");//表示是一个新用户
								System.out.println("新用户添加成功!");
								}
					}
				}catch(Exception e){}
			}
	}
}//用户注册结束

//用户登陆
class Ascends extends Thread{
	BufferedReader is;
	PrintWriter os;
	ServerSocket s;
	Socket c;
	Ascends(int port){
		try{
			s=new ServerSocket(port);
			System.out.println("(用户登陆)Server port:listening on port:"+port);
		}catch(Exception e){
			System.out.println("shuermao"+e);
			return;
		}
		this.start();
		
	}
	public void run(){
        while(true){
		try{
			c=s.accept();//for
			for(int i=0;i<VECTOR.tp.size();i++){
				A1 t=(A1)VECTOR.tp.get(i);
				if(t.socket0.isClosed())
					VECTOR.tp.remove(i);
			}//endfor
			System.out.println("用户登陆建立一个新连接...");
			new connection(c);
		}catch(Exception e){}
		}
	}
}
class connection extends Thread{
	    BufferedReader is;
		PrintWriter os;
		Socket c;
	    public connection(Socket s){
			c=s;
			try{ 
			  os=new PrintWriter(c.getOutputStream());
			  is=new BufferedReader(new InputStreamReader(c.getInputStream()));
            }catch(Exception e){
				try{
					System.out.println("异常2:"+e);
					c.close();
				}catch(Exception e1){System.out.println("异常3:"+e1);}
				return;
			}
			this.start();
		}
		public void run(){
			String s1,s2,s3;
			int i,j;
            while(true){
				try{
					s1=is.readLine();
					if(s1==null)break;
					i=s1.indexOf(58);//返回":"第一次出现的位置
					s2=s1.substring(0,i);//取出用户名
					s3=s1.substring(i+1,s1.length());//取出密码
					boolean flag=true;//标记当前用户名或密码错误
					for(j=0;j<VECTOR.user.size();j++){//判断此用户是否是注册用户
					    A a=new A();
						a=(A)(VECTOR.user.get(j));
						if(s2.equals(a.name)&&s3.equals(a.key)){
					//		System.out.println("用户名和密码正确!");
							A2.zhh=s2;
						    boolean flag1=true;//用来标记当前用户尚未登陆
						    for(i=0;i<VECTOR.tp.size();i++){
								A1 p=(A1)VECTOR.tp.get(i);
								if(s2.equals(p.user)){
									flag1=false;//标记当前用户已经登陆
									break;
								}
							}
						   if(flag1){//
							   new B(c,"1");//返回1表示正常登陆
						   }
						   else{
							   new B(c,"2");//返回2表示该用户已经在线
							}
							flag=false;
							break;
						}
					}
					if(flag){
					//	System.out.println("用户名或密码错误");
						new B(c,"0");
					}
			     /*  for(int k=0;i<VECTOR.tp.size();i++){
				       A1 t=(A1)VECTOR.tp.get(i);
				       if(t.socket0.isClosed())
					      VECTOR.tp.remove(i);
			       }//endfor*/
				}catch(Exception e){
                        try{
							c.close();
						}catch(Exception e1){System.out.println("异常4:"+e1);}
						System.out.println("异常5:"+e);
						break;
						}
			}
	}
}//用户登陆结束

class B{//发送
	public B(Socket c,String s){
		try{
			PrintWriter os=new PrintWriter(c.getOutputStream());
			os.println(s);
			os.flush();
		}catch(IOException e){
			System.out.println("Error"+e);
		}
	}
}


class A{//user容器中的内容
     public String name;
	 public String key;
};

class A1{
	public Socket socket0;
	public String user;
};

class A2{
	public static String zhh;
};
class FileWrite 
{
	public FileWrite(String s){
		try{
			File f=new File("user.txt");
		    FileWriter fw=new FileWriter(f,true);
			fw.write(s,0,s.length());
			fw.write("\r\n");//输入一个回车换行符
			fw.flush();
			fw.close();
		}
		catch(IOException e){}
	}
}


class FileRead 
{
	public FileRead(){
        int  i;
		String s,s1,s2;
		try{
		RandomAccessFile raf=new RandomAccessFile("user.txt","rw");
		
		while((s=raf.readLine())!=null){
            i=s.indexOf(58);//查找:在字符串中的位置
			s1=s.substring(0,i);
			s2=s.substring(i+1,s.length());
			A arr=new A();
			arr.name=s1;
			arr.key=s2;
			VECTOR.user.add(arr);//在容器中增加一项
		}
		raf.close();
		}
		catch(Exception e){}
	}
}

//判断用户名或密码是否合法,用户名由1到10个字母组成,密码由1到6个数字组成
class Judge{
	public boolean function1(String s){//判断是否是字母字符串
        int i;
		char txt[]=s.toCharArray();
		for(i=0;i<txt.length;i++){
			if(txt[i]<'A'||txt[i]>'Z'&&txt[i]<'a'||txt[i]>'z')
				return false;
		}
		return true;
	}

	public boolean function2(String s){//判断是否是数字字符串
		int i;
		char txt[]=s.toCharArray();
		for(i=0;i<txt.length;i++){
			if(txt[i]<'0'||txt[i]>'9')
				return false;
		}
		return true;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -