package com.guangsha.server;
import com.guangsha.entity.User;
import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.*;
public class Server { static Map map=new HashMap(); private ServerSocket serverSocket;
PrintWriter pw = null; private PrintWriter[] allOut = {}; static String username; static String pwd; public Server(){ try { System.out.println("正在启动服务端..."); serverSocket = new ServerSocket(8088); System.out.println("服务端启动完毕!"); } catch (IOException e) { e.printStackTrace(); } } public void start(){
try { while(true) { System.out.println("等待客户端链接...");
Socket socket = serverSocket.accept(); System.out.println("一个客户端链接了!"); ClientHandler clientHandler = new ClientHandler(socket); Thread t = new Thread(clientHandler); t.start();
} } catch (IOException e) { e.printStackTrace(); } }
public static void main(String[] args) { Server server = new Server(); server.start(); }
private class ClientHandler implements Runnable{ private Socket socket; private String host;
public ClientHandler(Socket socket){ this.socket = socket; host = socket.getInetAddress().getHostAddress(); } private void login() throws IOException {
OutputStream out = socket.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(out, "UTF-8"); BufferedWriter bw = new BufferedWriter(osw); PrintWriter pw = new PrintWriter(bw, true); InputStream in = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(in, "UTF-8"); BufferedReader br = new BufferedReader(isr); for(;;){ pw.println("请输入用户名:"); username = br.readLine(); pw.println("请输入密码:"); pwd = br.readLine(); if (pwd.equals(new User().getMap().get(username))) { pw.println("登录成功!"); break; } else { pw.println("账号或密码错误,请重试!!!"); } } }
public void run(){ try{ login(); InputStream in = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(in, "UTF-8"); BufferedReader br = new BufferedReader(isr);
OutputStream out = socket.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(out,"UTF-8"); BufferedWriter bw = new BufferedWriter(osw); pw = new PrintWriter(bw,true); synchronized (Server.this){ map.put(host,pw); allOut = Arrays.copyOf(allOut, allOut.length + 1); allOut[allOut.length - 1] = pw; } sendMessage(host + "上线了,当前在线人数:"+allOut.length);
String message = null; while ((message = br.readLine()) != null) { System.out.println(host + "说:" + message); if(PrivateChat(host,message))continue; sendMessage(host + "说:" + message); } }catch(IOException e){ e.printStackTrace(); }finally{ for (int i = 0; i < allOut.length; i++) { if (allOut[i] == pw) { allOut[i] = allOut[allOut.length - 1]; allOut = Arrays.copyOf(allOut, allOut.length - 1); break; } } sendMessage(host+"下线了,当前在线人数:"+allOut.length); try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } private void sendMessage(String message){ synchronized (Server.this) { for (int i = 0; i < allOut.length; i++) { allOut[i].println(message); } }
}
private boolean PrivateChat(String host,String s){ String[] str = s.split("\\ "); String st1=""; if(">>".equals(str[0])){ pw = (PrintWriter) map.get(str[1]); for (int i = 2; i < str.length; i++) { st1+=str[i]; } pw.println("来自"+host+"私聊消息:"+st1); return true; } return false; } } }
|