Test

package server;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;

import main.Client;
import main.TalkFrame;

public class Server {
	ServerSocket server;
	static int clientNum=0;
	//存放socket 的List
//	List<Socket> clientConnection=new ArrayList<Socket>();
//	List<String> clientName=new ArrayList<String>();
	Map<String, Socket> clientConnection=new TreeMap<String, Socket>();
	
	String hostName,dstName2;
	public Server(){
		try {
			server=new ServerSocket(8888);
			System.out.println("服务器已启动!");
		} catch (IOException e) {
//			e.printStackTrace();
			System.out.println("服务器启动失败");
		}
	}
	
	/**
	 * 内部类,监听是否有客户端连接到服务器,并将此客户端的socket传递给HandleSocket进行处理,
	同时将client存放到List中,即clientConnection中
	 * */
	class SocketListener implements Runnable{
		public void run(){
			Socket socket;
			try {
				while(true){
					socket=server.accept();
					
					HandleSocket hs=new HandleSocket(socket);
					new Thread(hs).start();
				}
			} catch (IOException e) {
//				e.printStackTrace();
				System.out.println("客户端连接服务器失败!");
			}
		}
	}
	
	/**
	 * 内部类,处理Socket,
	 * */
	class HandleSocket implements Runnable{
		Socket socket;
		OutputStream os;
		InputStreamReader isr;
		BufferedWriter bw;
		BufferedReader br;
		boolean isStopServer=true;
		String myName;
		public HandleSocket(Socket socket) {
			this.socket=socket;
		}
		public void run(){
			
				System.out.println("----------------------------------------");
				InputStream is;
				
				try {
					is = socket.getInputStream();
					isr=new InputStreamReader(is);
					br=new BufferedReader(isr);
					System.out.println("第"+clientNum+"个客户端连入服务器!");
					
					os=socket.getOutputStream();
					bw=new BufferedWriter(new OutputStreamWriter(os));
				} catch (IOException e1) {
					e1.printStackTrace();
				}

				//后续
				//接收第一个消息然后来决定到底做什么(注册、登陆、聊天、群聊)
				while(isStopServer){
					
	//System.out.println(value);
					try {
						int value=br.read();
					switch (value) {
					/**
					 * 1.登陆,2.注册,3.群聊,4.私聊,5.退出6,刷新在线人数.7传输文件
					 * */
					
						case 1:
							//登陆,
							String name=br.readLine();
							String password=br.readLine();
							if(User.check(name, password)!=null && null==clientConnection.get(name)){	//用户名密码正确,成功登陆
								clientConnection.put(name,socket);
								bw.write(1);//登陆成功返回1
								bw.flush();
								//刷新所有人
								myName=name;
								clientNum++;
								refreshUsers();
								
							}
							else{
								bw.write(0);
								bw.flush();
							}
							break;
						case 2:
							//注册
							String userName=br.readLine();
							String password2=br.readLine();
							if(User.isExist(userName, password2)){
								//已经存在,不进行注册了返回一个状态码
								bw.write(20);
							}
							else{
								//不存在,进行注册
								if(new User(userName, password2).insert()){
									System.out.println(userName+" 注册成功!");
									bw.write(21);
								}
								else{
									System.out.println("注册失败!");
									bw.write(20);
								}
							}
							bw.flush();
							break;
						case 3://聊天,群聊,把消息给所有人发一遍
							String str=br.readLine();
							Collection<Socket> sockets=clientConnection.values();
							Iterator<Socket> iterator=sockets.iterator();
							while(iterator.hasNext()){
								Socket socket=iterator.next();
								bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
								bw.write(3);
								bw.write(str+"\r\n");
								bw.flush();
							}
							break;
						case 4://先接后发 对方名字,自己名字,消息
							//私聊
							String myName=br.readLine();
							String dstName=br.readLine();
							String message=br.readLine();
							Socket s=clientConnection.get(dstName);//拿到对方的socket
							bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
							
							bw.write(4);
							bw.write(myName+"\r\n");
							bw.write(message+"\r\n");
							bw.flush();
							break;
						case 5:
							//退出
							String name3=br.readLine();
							isStopServer=false;
							
							clientConnection.remove(name3);	//这里可能不光要删,还要关。关socket关IO

							br.close();
							isr.close();
							bw.close();
							os.close();
							socket.close();
							System.out.println("有一个用户退出,还剩"+ --clientNum +"个用户!");
							refreshUsers();
							break;
						case 6:
							break;
							/**
							 * 服务器接收本地,服务器发给目标
							 * */
						case 11://服务器给目标地址发一个消息准备传输文件
							System.out.println("服务器给目标地址发一个消息准备传输文件");
							String fileName=br.readLine();
							hostName=br.readLine();
							dstName=br.readLine();
							Socket socket=clientConnection.get(dstName);	//这个socket会不会有问题
//System.out.println(socket);
							BufferedWriter bw2=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
							
							bw2.write(12);
							bw2.write(hostName+"\r\n");
							bw2.write(clientConnection.get(hostName).getInetAddress().getHostAddress()+"\r\n");
							bw2.write(fileName+"\r\n");
							bw2.flush();
							break;
							
							/**
							 * 服务器发给本地
							 * */
						case 13://对方愿意接收传输文件
							//这里的bw要重新变一下
							String dstName4=br.readLine();//对方的名字//接收的人
							String sendName=br.readLine();//发送的人
							System.out.println("对方愿意接收传输文件");
							Socket socket2=clientConnection.get(sendName);
System.out.println("server case 13:"+socket2);
							BufferedWriter bw3=new BufferedWriter(new OutputStreamWriter(socket2.getOutputStream()));
							bw3.write(15);
							bw3.write(dstName4+"\r\n");//这里可能没有
							bw3.write(clientConnection.get(dstName4).getInetAddress().getHostAddress()+"\r\n");
System.out.println("server case 13: "+dstName4);
							bw3.flush();
							break;
						case 14://拒绝接收
							Socket socket3=clientConnection.get(hostName);
							BufferedWriter bw4=new BufferedWriter(new OutputStreamWriter(socket3.getOutputStream()));
							bw4.write(16);
							bw4.flush();
							break;
					default:
						break;
					}
				} catch (IOException e) {
					System.out.println("有一个客户断开与服务器的连接 Server!");
					
					isStopServer=false;
					clientConnection.remove(myName);	//这里可能不光要删,还要关。关socket关IO

					try {
						br.close();
						isr.close();
						bw.close();
						os.close();
						socket.close();
					} catch (IOException e1) {
						e1.printStackTrace();
					}
					System.out.println("有一个用户退出,还剩"+ --clientNum +"个用户!");
					refreshUsers();
//					e.printStackTrace();
				}
			}
			
		}
		/**
		 * 当有用户登陆或退出时,刷新所有人拥有的当前用户
		 * 状态号6
		 * */
		public void refreshUsers(){
			try {
				Collection<Socket> sockets=clientConnection.values();//所有人的socket
				Set<String> names=clientConnection.keySet();//所有人的名字
				Iterator<Socket> iterator=sockets.iterator();
				Iterator<String>  iterator2;
				while(iterator.hasNext()){
					Socket socket=iterator.next();
					iterator2=names.iterator();
					//重新定义IO
					bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
					bw.write(6);
					bw.write(clientNum);
					while(iterator2.hasNext()){
						String name=iterator2.next();
						bw.write(name+"@"+clientConnection.get(name).getInetAddress().getHostAddress()+"\r\n");
					}
					bw.flush();
				}
				
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		}
	}
	
	
	public static void main(String[] args) {
		Server server=new Server();
		SocketListener listener=server.new SocketListener();
		new Thread(listener).start();
		
		Scanner scanner=new Scanner(System.in,"utf-8");
		while(true){
			String s=scanner.nextLine();
			
			if(s.equals("now people"))
				System.out.println("当前在线人数"+Server.clientNum+"人");
			else if(s.equals("now people detail")){
				Map<String, Socket> map=server.clientConnection;
				System.out.println(map);
			}else{
				System.out.println("请输入其他命令!");
			}
		}
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值