拿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方法的更多相关文章

  1. TCP服务端开发为例--web开发不同url请求为何会走不同方法

    拿java的web开发为例子,相信有很多小伙伴是做j2EE开发的,htpp请求,json数据传输都是工作中经常用的,查询请求,添加请求,修改请求前端配个url,例如https://localhost/ ...

  2. 03-案例——多任务版TCP服务端程序开发

    案例——多任务版TCP服务端程序开发   1. 需求     目前我们开发的TCP服务端程序只能服务于一个客户端,如何开发一个多任务版的TCP服务端程序能够服务于多个客户端呢?完成多任务,可以使用线程 ...

  3. python网络编程-TCP服务端的开发

    #TCP服务端开发 2 #方法说明 3 """ 4 bind(host,port)表示绑定端口号,host是ip地址,ip地址一般不进 行绑定,表示本机的任何一个ip地址 ...

  4. 网络编程之TCP客户端开发和TCP服务端开发

    开发 TCP 客户端程序开发步骤 创建客户端套接字对象 和服务端套接字建立连接 发送数据 接收数据 关闭客户端套接字 import socket if __name__ == '__main__': ...

  5. Python中的Tcp协议的应用之Tcp服务端程序开发

    TCP通信协议是面向连接的可靠的网络通信协议. 网络间想要进行数据传输必须要用到socket,socket翻译过来叫做套接字,其主要作用是不同设备或同一台设备之间的进程通信工具. Python中的Tc ...

  6. TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端

    目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP部分的使用 框架源码结构 补充说明 源码地址 说明 之前有好几篇博客在讲TCP/UDP通信方 ...

  7. 【转】TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端

    [转]TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端).UDP客户端 目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP ...

  8. 记录一些服务端术语和搭建web服务器

    菜单快捷导航 服务端常用术语 搭建web服务器和配置虚拟主机 记录一些服务端方面的常用术语 1.CS架构和BS架构 1.1 CS架构 CS(Client/Server),基于安装包类型的桌面或手机软件 ...

  9. Java Web开发和Python Web开发之间的区别

    今天的文章讨论了Java Web开发和Python Web开发之间的区别.我不鼓励我们在这里从Java Web迁移到Python Web开发.我只是想谈谈我的感受.它不一定适合所有情况,仅供我们参考. ...

随机推荐

  1. How to Quickly Create a Copy of a Table using Transact-SQL

    The easiest way to create a copy of a table is to use a Transact-SQL command. Use SELECT INTO to ext ...

  2. JSTL中foreach与fn表达式

    在jstl中的fn标签也是我们在网页设计中经常要用到的很关键的标签,在使用的时候要先加上头 <%@ taglib uri=" http://java.sun.com/jsp/jstl/ ...

  3. 如何将FastReportOnlineDesign 灵活的应用到C/S B/S 程序当中?

    一.好久没有写博客了,主要是停在这里太久了,有些事情让自己尽量不在去想,忘记不了一段难以忘怀的记忆,就让这一段美好的记忆沉没在无锡的太湖中吧!不在去想了.难以忘怀..... 二.废话不多说了,不如正题 ...

  4. 【开源】canvas图像裁剪、压缩、旋转

    前言 前段时间遇到了一个移动端对图像进行裁剪.压缩.旋转的需求. 考虑到已有各轮子的契合度都不高,于是自己重新造了一个轮子. 关于图像裁剪.压缩 在HTML5时代,canvas的功能已经非常强大了,可 ...

  5. 异步 HttpContext.Current实现取值的方法(解决异步Application,Session,Cache...等失效的问题)

    在一个项目中,为了系统执行效率更快,把一个经常用到的数据库表通过dataset放到Application中,发现在异步实现中每一次都会出现HttpContext.Current为null的异常,后来在 ...

  6. Kotlin(二) 函数定义

    1.不带参数,不返回值的函数 fun sum(){} 2.带参数,不带返回值的函数 fun sum(a:Int){} 3.带参数,带返回值的函数 fun sum(a:Int,b:Int) : Int{ ...

  7. 深入学习JS执行--创建执行上下文(变量对象,作用域链,this)

    一.介绍 本篇继上一篇深入理解js执行--单线程的JS,这次我们来深入了解js执行过程中的执行上下文. 本篇涉及到的名词:预执行,执行上下文,变量对象,活动对象,作用域链,this等 二.预执行 在上 ...

  8. HTTP协议类

    本文从以下几方面介绍HTTP协议 HTTP协议的主要特点 HTTP报文的组成部分 HTTP方法 HTTP状态码 POST和GET的区别 什么是持久连接 什么是管线化 主要特点: http协议的特点: ...

  9. MyBatis《2》

    MyBatis入参考文档:http://mybatis.org/mybatis-3/zh/   1.properties 属性 1.在MyBatis配置文件中引用属性文件     MyBatis允许在 ...

  10. 开源API测试工具 Hitchhiker v0.5更新 - 完善细节

    Hitchhiker 是一款开源的支持多人协作的 Restful Api 测试工具,支持Schedule, 数据对比,压力测试,支持上传脚本定制请求,可以轻松部署到本地,和你的team成员一起管理Ap ...