拿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请求为何会走不同方法的更多相关文章

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

    拿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. 跨站请求伪造(CSRF)

    1. 什么是跨站请求伪造(CSRF)  CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者session Riding,通常缩 ...

  2. 阿里云 centos7 django + uWSGI+Nginx + python3 部署攻略

    centos7+nginx+python3+django+uwsgi配置Django 项目部署   1.租的服务器(选择centos)的话,需要在阿里云后台控制台开放几个端口,克隆一下已开放的端口,t ...

  3. 洗礼灵魂,修炼python(13)--模块random,math,pickle

    random 1.作用: random模块用于生成随机数 2.常用函数: random:用于生成一个0到1的随机符点数: 0 <= n < 1.0 uniform(a, b):用于生成一个 ...

  4. python第五十三天--进程,协程.select.异步I/O...

    进程: #!usr/bin/env python #-*-coding:utf-8-*- # Author calmyan import multiprocessing,threading,time ...

  5. ES6 入门

    1.简介 ECMAScript 6.0 是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了.它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序, ...

  6. pip安装django的时候提示没有这个命令

    问题描述: 在安装pyenv安装完python的时候,用pip安装django提示没有这个命令 [root@zabbix ~]# pip install django== 2.0 pyenv: pip ...

  7. Git命令实现本地文件推送到git仓库

    前提: ①确定本机(windows环境)已经安装git(https://git-scm.com/downloads) ②建立好远程Git仓库   1.在你想推送的文件夹下:右键→选择Git Bath ...

  8. 【PAT】B1075 链表元素分类(25 分)

    这道题算有点难,心目中理想的难度. 不能前怕狼后怕虎,一会担心超时,一会又担心内存过大,直接撸 将三部分分别保存到vector 有意思的在于输出 分别输出第一个的add和num 中间输出nextadd ...

  9. Kali Linux 初始化配置:Apache2 /SSH /FTP

    Kali Linux是基于Debian的Linux发行版, 设计用于数字取证操作系统.Kali Linux预装了许多渗透测试软件,包括nmap .Wireshark .John the Ripper, ...

  10. JavaScript中数组的增删改查以及应用方式

    数组的增加方法 1.push()方法向数组中末尾添加一个元素,原数组改变 var arr=[1,2,3,4]; var arr1=arr.push(6); console.log(arr);//打印出 ...