总结二

简单客户端的实现:

可以理解为客户端和服务器端的通信是在Socket对象上进行的,那么客户端要与服务器端连接起来,首先就是要创建一个Socket对象:

Socket client = new Socket(“IP”,port);

 

 

通信的步骤就是:

1、  客户端连结服务器,服务器要求客户端输入用户名及密码。

2、  客户端输入用户名和密码,服务器验证用户信息是否正确。若信息不相符,则提示用户信息有错。

3、  若通过验证,服务器则给其他在线客户机发送消息:该用户上线,目前在线人数几人。

4、  在线用户通过输入框向服务器发送消息,服务器会转发给其他所有的在线用户。

5、  当某个客户端退出,服务器通知其他客户机:某用户下线,当前在线人数几人。

 

 

简化来说,基本的通信过程应该是:

1、  客户端从输入框读取消息,发送信息给服务器端,服务器端的输入流读入。

2、  然后服务器端的输出流写出,客户端的输入流读入,并显示在客户端的输出界面上。

 

 

所以客户端的连接对象创建后,也需要得到输入输出流,以及读取消息、发送消息的方法。与服务器端相同,客户端中的连接处理的类也是一个线程类,因为从服务器 消息的方法存在阻塞,需要使用到线程。另外,客户端还需要一个界面类,有发送消息的输入框和显示聊天消息的文本框。

 

NetClient类:包含通信的基本方法,是一个线程类,发送输入框的消息,并聊天内容到文本框。

public class NetClient extends Thread{
	
	private String ip;
	private int port;
	
	private javax.swing.JTextArea jta;
	private BufferedReader brd;
	private OutputStream ous;
	private Socket client;
	
	//构造器,创建对象时要有指定的IP及端口还有输出框
	public NetClient(String ip,int port,javax.swing.JTextArea jta){
		this.ip = ip;
		this.port = port;
		this.jta = jta;
	}
	/**
	 * 连结服务器是否成功的方法
	 * @return
	 */
	public boolean conn2Server(){
		try{//创建一个到服务器端的socket对象
		client = new Socket(ip,port);
		//得到输入流输出流对象
		InputStream ins = client.getInputStream();
		brd = new BufferedReader(new InputStreamReader(ins));
		ous = client.getOutputStream();
		return true;
		}catch(Exception ef){
			ef.printStackTrace();
		}
		return false;
	}
	
	/**
	 * 发送消息到服务器的方法
	 */
	public void sendMsg(String msg){
		try{
			msg+="\r\n";
		
		ous.write(msg.getBytes());
		ous.flush();
		}catch(Exception ef){
			ef.printStackTrace();
		}
	}
	
	/**
	 * 从服务器读取消息的方法,有阻塞,需要使用线程
	 * @return
	 * @throws IOException 
	 */
	public String readMsg() throws IOException{
		String input = brd.readLine();
		//将此消息显示到界面
		jta.append(input+"\r\n");
		return input;
	}
	
	
	public void run(){
		try{
		String s = this.readMsg();
		while(!"bye".equals(s)){
			s = this.readMsg();
		}
		
		client.close();
		}catch(Exception ef){
			ef.printStackTrace();
		}
	}
	
}

 

 

ClientUI类:显示客户端界面。并启动客户端线程的方法。

 

public class ClientUI extends JFrame{

	private javax.swing.JTextArea jta_output = new javax.swing.JTextArea(12,25);
	private NetClient nc;
	
	public static void main(String[] args) {
		ClientUI cu = new ClientUI();
		cu.setUpThread();

	}
	/**
	 * 启动客户端连结线程方法
	 */
	public void setUpThread(){
		nc = new NetClient("localhost",9090,jta_output);
		
		if(nc.conn2Server()){
			this.showUI();
			nc.start();
		}
	}
	/**
	 * 显示界面的方法
	 */
	public void showUI(){
		this.setTitle("客户端聊天窗口");
		this.setSize(300,400);
		this.setLayout(new java.awt.FlowLayout());
		this.add(jta_output);
		
		final javax.swing.JTextArea jta_input = new javax.swing.JTextArea(5,25);
		this.add(jta_input);
		javax.swing.JButton bu_send = new javax.swing.JButton("Send");
		this.add(bu_send);
		
		ActionListener al = new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent e) {
				String msg = jta_input.getText();
				nc.sendMsg(msg);
				jta_input.setText("");
			}
			
		};
		
		bu_send.addActionListener(al);
		//jta_input.addAncestorListener(al);
		this.setVisible(true);
		
	}

}

 

运行后聊天过程如下:

提供了基于BP(Back Propagation)神经网络结合PID(比例-积分-微分)控制策略的Simulink仿真模型。该模型旨在实现对杨艺所著论文《基于S函数的BP神经网络PID控制器及Simulink仿真》中的理论进行实践验证。在Matlab 2016b环境下开发,经过测试,确保能够正常运行,适合学习和研究神经网络在控制系统中的应用。 特点 集成BP神经网络:模型中集成了BP神经网络用于提升PID控制器的性能,使之能更好地适应复杂控制环境。 PID控制优化:利用神经网络的自学习能力,对传统的PID控制算法进行了智能调整,提高控制精度和稳定性。 S函数应用:展示了如何在Simulink中通过S函数嵌入MATLAB代码,实现BP神经网络的定制化逻辑。 兼容性说明:虽然开发于Matlab 2016b,但理论上兼容后续版本,可能会需要调整少量配置以适配不同版本的Matlab。 使用指南 环境要求:确保你的电脑上安装有Matlab 2016b或更高版本。 模型加载: 下载本仓库到本地。 在Matlab中打开.slx文件。 运行仿真: 调整模型参数前,请先熟悉各模块功能和输入输出设置。 运行整个模型,观察控制效果。 参数调整: 用户可以自由调节神经网络的层数、节点数以及PID控制器的参数,探索不同的控制性能。 学习和修改: 通过阅读模型中的注释和查阅相关文献,加深对BP神经网络与PID控制结合的理解。 如需修改S函数内的MATLAB代码,建议有一定的MATLAB编程基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值