拿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. C#中访问私有成员

    首先访问一个类的私有成员不是什么好做法.大家都知道私有成员在外部是不能被访问的.一个类中会存在很多私有成员:如私有字段.私有属性.私有方法.对于私有成员造访,可以套用下面这种非常好的方式去解决. pr ...

  2. solr索引库的创建

    solr索引库的创建 一.找到你安装的[solrhome]目录(我的是这个) 二.进入该目录 三.选择其中任意一个索引库复制一份到该目录下并更名为要创建的索引库名称 四.进入[myindex]目录下, ...

  3. 洛谷 P3384 【模板】树链剖分

    树链剖分 将一棵树的每个节点到它所有子节点中子树和(所包含的点的个数)最大的那个子节点的这条边标记为"重边". 将其他的边标记为"轻边". 若果一个非根节点的子 ...

  4. [转载] linux中文件描述符fd和文件指针flip的理解

    转载自http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html 简单归纳:fd只是一个整数,在open时产生.起到一个索引的作用,进程通 ...

  5. RunLoop想入门,看这篇就够了

    前言 刚刚听到RunLoop的时候我也是一脸懵逼,这是什么,有什么用呢,逼格貌似还挺高.然后就开始尝试去搞懂它,去找博客,但是几乎所有的博客都是枯燥乏味的,都是讲概念,然后给个实例,对于我这个小白来说 ...

  6. python 标准模块 string

    string 模块提供了一些用于处理字符串类型的函数 案例: #!/usr/bin/evn python #_*_ coding:utf-8 -*- import string text = &quo ...

  7. 0e开头MD5值小结

    s878926199a 0e545993274517709034328855841020 s155964671a 0e342768416822451524974117254469 s214587387 ...

  8. DES对称加密算法简析

    1 对称加密算法 在了解DES算法前,先加单介绍一下对称加密算法,因为DES属于对称加密算法的一种. 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密 ...

  9. 关于回调(callback)

    如果要理解回调,需要在分同步通信.异步通信的基础上了解 举个通俗的例子: 你打电话问书店老板有没有<JS>这本书,如果是同步通信机制,书店老板会说,你稍等,"我查一下" ...

  10. css3实现聊天气泡

    1: <div class="comment"></div><style type="text/css"> .comment ...