Test

来源:互联网 发布:起点网络交易怎么下单 编辑:程序博客网 时间:2024/05/17 22:11
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);//登陆成功返回1bw.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);//拿到对方的socketbw=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关IObr.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关IOtry {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();//所有人的socketSet<String> names=clientConnection.keySet();//所有人的名字Iterator<Socket> iterator=sockets.iterator();Iterator<String>  iterator2;while(iterator.hasNext()){Socket socket=iterator.next();iterator2=names.iterator();//重新定义IObw=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
原创粉丝点击