TCP服务端开发为例--web开发不同url请求走不同control方法
拿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();//售货员登录0
break;
case MANAGERADDSOLDER:
managerAddSolder();//管理员添加售货员7
break;
case MANAGERDELETESOLDER:
managerDeleteSolder();//管理员删除售货员8
break;
case MANAGERMOIDFYSOLDER:
managerModifySolder();//管理员修改售货员9
break;
}
}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
...
TCP服务端开发为例--web开发不同url请求走不同control方法的更多相关文章
- TCP服务端开发为例--web开发不同url请求为何会走不同方法
拿java的web开发为例子,相信有很多小伙伴是做j2EE开发的,htpp请求,json数据传输都是工作中经常用的,查询请求,添加请求,修改请求前端配个url,例如https://localhost/ ...
- 03-案例——多任务版TCP服务端程序开发
案例——多任务版TCP服务端程序开发 1. 需求 目前我们开发的TCP服务端程序只能服务于一个客户端,如何开发一个多任务版的TCP服务端程序能够服务于多个客户端呢?完成多任务,可以使用线程 ...
- python网络编程-TCP服务端的开发
#TCP服务端开发 2 #方法说明 3 """ 4 bind(host,port)表示绑定端口号,host是ip地址,ip地址一般不进 行绑定,表示本机的任何一个ip地址 ...
- 网络编程之TCP客户端开发和TCP服务端开发
开发 TCP 客户端程序开发步骤 创建客户端套接字对象 和服务端套接字建立连接 发送数据 接收数据 关闭客户端套接字 import socket if __name__ == '__main__': ...
- Python中的Tcp协议的应用之Tcp服务端程序开发
TCP通信协议是面向连接的可靠的网络通信协议. 网络间想要进行数据传输必须要用到socket,socket翻译过来叫做套接字,其主要作用是不同设备或同一台设备之间的进程通信工具. Python中的Tc ...
- TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端
目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP部分的使用 框架源码结构 补充说明 源码地址 说明 之前有好几篇博客在讲TCP/UDP通信方 ...
- 【转】TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端
[转]TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端).UDP客户端 目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP ...
- 记录一些服务端术语和搭建web服务器
菜单快捷导航 服务端常用术语 搭建web服务器和配置虚拟主机 记录一些服务端方面的常用术语 1.CS架构和BS架构 1.1 CS架构 CS(Client/Server),基于安装包类型的桌面或手机软件 ...
- Java Web开发和Python Web开发之间的区别
今天的文章讨论了Java Web开发和Python Web开发之间的区别.我不鼓励我们在这里从Java Web迁移到Python Web开发.我只是想谈谈我的感受.它不一定适合所有情况,仅供我们参考. ...
随机推荐
- sql连接语句
简述 简单回顾并总结下不同的表连接语句有什么异同之处以及一些概念. 建库语句如下 DROP DATABASE IF EXISTS `demo`; CREATE DATABASE `demo`; USE ...
- meta 是什么??
META http-equiv 大全HTTP-EQUIV类似于HTTP的头部协议,它回应给浏览器一些有用的信息,以帮助正确和精确地显示网页内容.常用的HTTP-EQUIV类型有: 1.Content- ...
- Java _分页Jdbc 版
人生得意须尽欢,莫使金樽空对月. 先天下之忧而忧,后天下之乐而乐. 大东北的天气已经渐入佳境了,在夜深人静的时候,随着鼠标的移动,键盘清脆的声音,开启了今天的睡前代码工程!今天聊聊JDBC版本的分页, ...
- Map的遍历方法(java)
方法一.Set<Object> keySet();返回集合中所有的key组成的集合. 代码:Map<String , String > map=new HashMap();f ...
- Python字符编码详解(转)
http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html 在没有reload(sys)之前调用sys.setdefaultencoding ...
- vue-cli 如何配置sass
第一步:安装对应的node模块 npm install node-sass --save-dev npm install sass-loader --save-dev 第二步:在webpack.bas ...
- TFboy养成记
转自:http://www.cnblogs.com/likethanlove/p/6547405.html 在tensorflow的使用中,经常会使用tf.reduce_mean,tf.reduce_ ...
- oracle 物化视图 job
在oracle数据库里边,创建物化视图之后,系统在DBMS_jobs文件夹下,会自动创建相应的job,右键执行job的时候报错如下: 问题:ORA-12012: 自动执行作业 198 出错 ORA-1 ...
- States字段的使用规范
背景 为了统一数据库表的状态字段,统一数据库表设计,简化字段在程序开发中的使用方式. 解决方式 States对应位域枚举StatesFlags. /// <summary> /// 数据状 ...
- pytesseract使用
1.安装pip install pytesseract 2.安装tesseract-ocr,下载地址:https://github.com/UB-Mannheim/tesseract/wiki,我安装 ...