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开发.我只是想谈谈我的感受.它不一定适合所有情况,仅供我们参考. ...
随机推荐
- EasyWcf------无需配置,无需引用,动态绑定,轻松使用
设计原则:万物皆对象 前言:在上一篇的0配置使用Wcf中,虽然使用已经很方便了,但是对于最求极致简洁得人来说(比如我),客户端需要通过手动引用服务才能够调用服务接口,那么有没有办法能够绕过手动引用这一 ...
- elastic-search单机部署以及中文分词IKAnalyzer安装
前提条件 elasticsearch使用版本5.6.3,需要jdk版本1.8,低于该版本不能使用 下载 https://artifacts.elastic.co/downloads/elasticse ...
- 多少牛逼的程序员毁在low逼的英文发音上(JAVA)
最最常用的关键词及音标 数据类型:boolean.byte.short.int.long.double.char.float.double. 包引入和包声明:import.package. 用于类和接 ...
- mysql多个TimeStamp设置(转)
原文地址:http://www.cnblogs.com/yjf512/archive/2012/11/02/2751058.html timestamp设置默认值是Default CURRENT_TI ...
- Struts2初探
我记得美妙的瞬间:在我的面前出现了你,有如昙花一现的幻影 今天写一篇Struts2框架的,在很久很久以前,Struts2可谓是称霸江湖,纵然现在有后起之秀,但Struts2依然可以成为老牌的主流框架, ...
- MVC 小案例 -- 信息管理
前几次更新博客都是每次周日晚上到周一,这次是周一晚上开始写,肯定也是有原因的!那就是我的 Tomact 忽然报错,无法启动,错误信息如下!同时我的 win10 也崩了,重启之后连 WIFI 的标志也不 ...
- PHP设计模式之工厂模式
工厂模式(Factory pattern)和单例模式一样,是另外一种创建型模式. 和单例模式不同的是,单例模式会创建和管理一个单独的类型的单一对象,工厂模式则是用于创建多种不同类型的类的多个对象. 工 ...
- wpa破解学习实践
概述: 针对WEP的一些弱点,WPA(WiFi Protected Access)一一改进:
- HTML5到底将给企业带来什么?
HTML5 是近年来互联网行业的热门词汇,火的很.有人高调宣称"APP 将在几年内灭亡,HTML5 取而代之" 改变企业网络广告的模式与分布 广告是企业网络营销的主要方式之一 十几 ...
- powerdesigner 不能自动生成注释的解决方法
解决power designer 不能自动生成注释的解决办法只需要3步: 一.快捷键 Alt+Shift+X 打开脚本编辑器: 二.将下面天蓝色的字体脚本添加到脚本编辑器里面: Option Expl ...