TCP服务端开发为例--web开发不同url请求为何会走不同方法
拿java的web开发为例子,相信有很多小伙伴是做j2EE开发的,htpp请求,json数据传输都是工作中经常用的,查询请求,添加请求,修改请求前端配个url,例如https://localhost/intsmaze/user/add?name=intsmaze。然后后端建立一个controler类(类上配置url映射/user),然后创建一个addUser方法(在方法上配置映射/add)。然后启动web应用,前端发送的请求就会自动走到后端的addUser方法了。
但是你知道为什么这个请求走对应的方法吗?下面让我拿我大三期间基于TCP写的服务端程序做例子来看看背后的原理吧。这个程序时一个超市管理系统,客户端使用javaSwing编写,服务端使用javaSE编写,双方通信使用TCP协议,数据存储在mysql中。完整的项目上传在github上https://github.com/intsmaze/Swing-TCP-mysql。
服务端启动类,绑定端口。
public class LoginServer { private int port=1000;private ServerSocket serversocket;private ExecutorService executorservice;private final int POOL_SIZE=1;//一个CPU线程池中工作线程的数目public LoginServer() throws Exception{ serversocket=new ServerSocket();serversocket.bind(new InetSocketAddress("127.0.0.1",port)); executorservice=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE); //当前CPU数*1就是总线程池数目 }public void service(){while(true){Socket socket=null; try{socket=serversocket.accept();executorservice.execute(new Handler(socket));}catch(IOException e){e.printStackTrace();}}} public static void main(String[] args) throws Exception {new LoginServer().service(); } }
路径映射方法
localhost/intsmaze/后面不同的路径就是截取对应的字符串然后调用对应的方法
public class Handler implements Runnable{public static final int SOLDERCONNECTION=0;//售货员登录public static final int MANAGERADDSOLDER=7;//管理员添加售货员public static final int MANAGERDELETESOLDER=8;//管理员删除售货员public static final int MANAGERMOIDFYSOLDER=9;//管理员修改售货员private Socket socket; private BufferedReader bufIn=null;private BufferedWriter bufOut=null; private Connection connection=null; private PreparedStatement preparedstatement=null;private ResultSet resultset=null;public Handler(Socket socket) throws IOException{this.socket=socket;bufIn=new BufferedReader(new InputStreamReader(socket.getInputStream()));bufOut=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); } public void run() {try{ String line=bufIn.readLine();//读取第一个选着功能 int i=Integer.valueOf(line); switch(i) {case SOLDERCONNECTION:solderConnection();//售货员登录0break;case MANAGERADDSOLDER:managerAddSolder();//管理员添加售货员7break;case MANAGERDELETESOLDER:managerDeleteSolder();//管理员删除售货员8break;case MANAGERMOIDFYSOLDER:managerModifySolder();//管理员修改售货员9break; }}catch(Exception e){socketUtil.close(socket);}} public void solderConnection() throws Exception{String sr=null; //读取账号和密码String arr[] =bufIn.readLine().split("#");; connection=JdbcUtil.getConnection();preparedstatement=connection.prepareStatement("SELECT * FROM solder WHERE solder_number=? and solder_password=?");preparedstatement.setString(1,arr[0]);preparedstatement.setString(2,arr[1]); resultset=preparedstatement.executeQuery(); if(resultset.next()){ bufOut.write("ok\n");//回馈查询信心 bufOut.flush(); sr=resultset.getInt(1)+"#"+resultset.getString(2)+"#"+resultset.getString(3)+"\n";bufOut.write(sr);bufOut.flush(); }else{bufOut.write("no");//回馈查询信心 bufOut.flush(); }JdbcUtil.release(resultset, preparedstatement, connection);} public void managerAddSolder() throws Exception{connection=JdbcUtil.getConnection(); String name=bufIn.readLine(); System.out.println(name);preparedstatement=connection.prepareStatement("insert into solder(solder_name) values(?) ");preparedstatement.setString(1,name); preparedstatement.executeUpdate();//执行更新 preparedstatement=connection.prepareStatement("select *from solder where solder_number=(select MAX(solder_number)from solder) ");resultset=preparedstatement.executeQuery();//执行更新 if(resultset.next()){bufOut.write("ok\n");//回馈查询信心 bufOut.flush();String str=resultset.getString(1)+"#"+resultset.getString(2)+"#"+resultset.getString(3);bufOut.write(str+"\n");//回馈查询信心 bufOut.flush(); }else{bufOut.write("no\n");//回馈查询信心 bufOut.flush();} JdbcUtil.release(resultset, preparedstatement, connection);}public void managerModifySolder() throws Exception{connection=JdbcUtil.getConnection();String arr[] = null;String line=null;String number=bufIn.readLine();preparedstatement=connection.prepareStatement("select *from solder WHERE solder_number=? ");preparedstatement.setString(1,number); resultset=preparedstatement.executeQuery();if(resultset.next()){bufOut.write("ok\n");//回馈查询信心 bufOut.flush(); line=bufIn.readLine();arr=line.split("#");preparedstatement=connection.prepareStatement("update solder set solder_password=?,solder_name=? WHERE solder_number=? ");preparedstatement.setString(1,arr[2]); preparedstatement.setString(2,arr[1]); preparedstatement.setString(3,arr[0]); preparedstatement.executeUpdate();//执行更新 }else{bufOut.write("no\n");//回馈查询信心 bufOut.flush(); } socket.close();JdbcUtil.release(resultset, preparedstatement, connection);}public void managerDeleteSolder() throws Exception{connection=JdbcUtil.getConnection(); String number=bufIn.readLine();preparedstatement=connection.prepareStatement("select *from solder WHERE solder_number=? ");preparedstatement.setString(1,number); resultset=preparedstatement.executeQuery();if(resultset.next()){bufOut.write("ok\n");//回馈查询信心 bufOut.flush(); preparedstatement=connection.prepareStatement("delete from solder WHERE solder_number=? ");preparedstatement.setString(1,number); preparedstatement.executeUpdate();//执行更新 }else{bufOut.write("no\n");//回馈查询信心 bufOut.flush(); } socket.close();JdbcUtil.release(resultset, preparedstatement, connection);}}
以localhost/intsmaze/user/add?name=intsmaze的url来反向剖析tcp服务端如何接收,并调用对应方法。localhost是与服务器建立连接,然后发送intsmaze/user/add?name=intsmaze为一个数据到服务器,服务器接收到该字符串后,根据/截取,然后判断该请求是发给intsmaze的应用。然后通过user知道这个请求时user模块(用户管理模块),然后通过add知道是调用添加用户方法。?后面就是对于的参数获取存入数据库即可.
对上面的方法改进如下即可实现
String line=bufIn.readLine();//读取第一个选着功能 line的值为intsmaze/user/add?name=intsmaze String arr[]=line.split("/");String model=arr[1];String method=arr[2].split("?")[0];String param=arr[2].split("?")[1];if(model.endsWith("user")){if(method.equals("add")){user.add(param);}}else if(model.equals("goods")){...}else if...
转载于:https://www.cnblogs.com/intsmaze/p/8098173.html
TCP服务端开发为例--web开发不同url请求为何会走不同方法相关推荐
- TCP服务端程序开发
TCP服务端程序开发 1. 开发 TCP 服务端程序开发步骤回顾 创建服务端端套接字对象 绑定端口号 设置监听 等待接受客户端的连接请求 接收数据 发送数据 关闭套接字 2. socket 类的介绍 ...
- 网络编程之TCP服务端程序开发
TCP服务端程序开发 学习目标 能够写出TCP服务端应用程序接收和发送消息 1. 开发 TCP 服务端程序开发步骤回顾 创建服务端端套接字对象 绑定端口号 设置监听 等待接受客户端的连接请求 接收数据 ...
- 采用netty开发智能手表tcp服务端还是非常不错的
采用netty开发智能手表tcp服务端还是非常不错的,经过单服务部署测试并发能达到10w,可以用于开发开发马蹄锁,儿童智能手表,其他智能设备,物联网等等,有啥有趣好玩的物联网可以进行交流一下
- [golang Web开发] 1.golang web开发:简介以及web服务器的搭建以及http协议简介
一.web开发简介 1.简介 Web应用在我们的生活中无处不在,看看我们日常使用的各个应用程序,它们要么是 Web应用,要么是移动 App 这类 web应用的变种,无论哪一种编程语言,只要它能够开发出 ...
- Qt中TCP服务端编程
文章目录 1 Qt中的TCP服务端编程 1.1 TCP服务端编程介绍 1.2 Qt中的TCP服务端编程 1 Qt中的TCP服务端编程 1.1 TCP服务端编程介绍 网络中的服务端: 服务端是为客户端服 ...
- ESP32学习笔记(9)——TCP服务端
一.TCP与UDP优缺点 1.TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接. 2.TCP提供可靠的服务.也就是说,通过TCP连接传送的数据,无差错,不丢失 ...
- windows Socket编程之TCP服务端与客户端
在前面的文章中有一篇讲到了命名管道通信,它是创建一根管道来进行进程之间或网络之间通信的.但是它有些缺陷,比如说效率较低等.而从这篇文章开始将介绍socket编程.socket是通过TCP,UDP,IP ...
- php和python web开发-初入Web开发,php、python和ruby应该学哪个?
php.python和ruby都适合做WEB开发,对于web开发初学者来说,最大的问题就是学习哪种编程语言更适合未来的职业发展并且更有前景.要选择一门适合自己的语言,首先你要考虑php.python和 ...
- java和python的web自动化有什么区别-Java Web开发和Python Web开发之间的区别
今天的文章讨论了Java Web开发和Python Web开发之间的区别.我不鼓励我们在这里从Java Web迁移到Python Web开发.我只是想谈谈我的感受.它不一定适合所有情况,仅供我们参考. ...
- 初识JavaWeb(web开发概述、web开发环境的搭建、创建并发布web项目)
文章目录 JavaWeb web开发概述 web开发环境的搭建 web服务器的选择 环境搭建 Tomcat的配置文件 创建发布Web项目 JavaWeb web开发概述 学习web开发, 我们需要一台 ...
最新文章
- Codeforces Round #556 (Div. 2)
- cacti的mysql密码_cacti 监控搭建
- jenkins安装(用户配置)(2)
- dj鲜生-用户中心-个人信息
- 聊聊编程那些破事-0.Prehistory
- 2020-08-18 每日一句
- mongoose的用法(注:连接数据库)
- OpenStreetMap/Google/百度/Bing瓦片地图服务(TMS)
- 成人高考计算机基础历年真题,成人高考历年真题及答案
- 路由器 mac 和 bssid是一个吗
- CC控制服务的设计和侦测方法综述
- Python PDF转高清图片 可设置转前几张
- 深度学习项目-图片自动着色
- 工程伦理(2021春)第四章课后习题答案
- NLPCC历年投稿及接收率
- opc服务器不稳定的原因,OPC Client和OPC Server容易出现通讯故障,原因是什么?
- Python3 面向对象编程
- 云服务器密码登录异常的解决办法
- 判断满足条件的三位数
- Elastic 极客时间 阮一鸣 学习笔记_入门
热门文章
- Nginx 笔记与总结(4)配置 server 访问日志
- 显示分类对应的文章数目,为空的设置为0,按文章数目排序
- 百度——LBS.云 v2.0——云存储的POI创建和删除--Android 源码
- 小组级Windows下架设git服务器
- 关于 it行业未来 的个人判断
- ERNIE 3.0 | 刷榜了!60多项任务取得最好效果
- 昨天遇到的几个常用函数
- 史**_python保存为txt
- 养成女友?我训练出了一个“杨超越”聊天机器人
- pytorch-----使用Module类来自定义模型