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("请输入其他命令!");
}
}
}
}
Test
最新推荐文章于 2024-05-30 18:48:53 发布