Test

本文详细阐述了一个服务器如何处理客户端连接、用户登陆、注册、群聊、私聊、退出等操作,包括登录验证、注册逻辑、消息广播、私聊处理、用户离线通知和文件传输等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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("请输入其他命令!");
			}
		}
	}

}

内容概要:本书《Deep Reinforcement Learning with Guaranteed Performance》探讨了基于李雅普诺夫方法的深度强化学习及其在非线性系统最优控制中的应用。书中提出了一种近似最优自适应控制方法,结合泰勒展开、神经网络、估计器设计及滑模控制思想,解决了不同场景下的跟踪控制问题。该方法不仅保证了性能指标的渐近收敛,还确保了跟踪误差的渐近收敛至零。此外,书中还涉及了执行器饱和、冗余解析等问题,并提出了新的冗余解析方法,验证了所提方法的有效性和优越性。 适合人群:研究生及以上学历的研究人员,特别是从事自适应/最优控制、机器人学和动态神经网络领域的学术界和工业界研究人员。 使用场景及目标:①研究非线性系统的最优控制问题,特别是在存在输入约束和系统动力学的情况下;②解决带有参数不确定性的线性和非线性系统的跟踪控制问题;③探索基于李雅普诺夫方法的深度强化学习在非线性系统控制中的应用;④设计和验证针对冗余机械臂的新型冗余解析方法。 其他说明:本书分为七章,每章内容相对独立,便于读者理解。书中不仅提供了理论分析,还通过实际应用(如欠驱动船舶、冗余机械臂)验证了所提方法的有效性。此外,作者鼓励读者通过仿真和实验进一步验证书中提出的理论和技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值