• 简单客户端服务器模型(C++、python和go语言示例)


    工作中用到了C/S模型,所做的也无非是给服务器发数据,但开发阶段会遇到程序自身的回环测试,需要用到简单的服务端以便验证数据发送的正确性。

    写软件用C++,跑测试用python,这段时间也刚好看go语言,所以都要有demo。以下三组程序实现的功能相同,这里一起做下总结。

    一、C++实现

    Boost.Asio是一个跨平台的C++库,它用现代C++方法为网络和底层I/O程序提供了一致的异步I/O模型。 为了跨平台,我用boost库实现,具体如下。

    服务端代码:

     1 /*
    2 File : svr.cpp
    3 Author : Mike
    4 E-Mail : Mike_Zhang@live.com
    5 */
    6
    7 #include <iostream>
    8 #include <boost/asio.hpp>
    9
    10 using boost::asio::ip::tcp;
    11 enum {max_length = 1024};
    12
    13 typedef boost::shared_ptr<tcp::socket> socket_ptr;
    14
    15 int main()
    16 {
    17 boost::asio::io_service io_service;
    18 tcp::acceptor a(io_service, tcp::endpoint(tcp::v4(), atoi("12345")));
    19 for (;;)
    20 {
    21 socket_ptr sock(new tcp::socket(io_service));
    22 a.accept(*sock);
    23 char data[max_length];
    24 boost::system::error_code error;
    25 size_t length = sock->read_some(boost::asio::buffer(data), error);
    26 data[length] = 0;
    27 std::cout<<data<<std::endl;
    28 sock->close();
    29 }
    30 return 0;
    31 }

    客户端代码:

     1 /*
    2 File : cli.cpp
    3 Author : Mike
    4 E-Mail : Mike_Zhang@live.com
    5 */
    6 #include <iostream>
    7 #include <boost/asio.hpp>
    8
    9 using boost::asio::ip::tcp;
    10 enum { max_length = 1024 };
    11
    12 int main(int argc, char* argv[])
    13 {
    14 boost::asio::io_service io_service;
    15 tcp::resolver resolver(io_service);
    16 tcp::resolver::query query(tcp::v4(), "127.0.0.1","12345");
    17 tcp::resolver::iterator iterator = resolver.resolve(query);
    18
    19 tcp::socket s(io_service);
    20 s.connect(*iterator);
    21
    22 std::cout << "Please input: ";
    23 char request[max_length];
    24 std::cin.getline(request, max_length);
    25 size_t request_length = strlen(request);
    26 boost::asio::write(s, boost::asio::buffer(request, request_length));
    27 return 0;
    28 }

    编译:g++ cli.cpp -o cli -lboost_system -lboost_thread-mt

    二、python实现

    服务端代码:

     1 '''
    2 File : svr.py
    3 Author : Mike
    4 E-Mail : Mike_Zhang@live.com
    5 '''
    6 import socket,os
    7 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    8 sock.bind(('127.0.0.1', 12345))
    9 sock.listen(5)
    10 while True:
    11 connection,address = sock.accept()
    12 buf = connection.recv(1024)
    13 print buf
    14 connection.close()

    客户端代码:

     1 '''
    2 File : cli.py
    3 Author : Mike
    4 E-Mail : Mike_Zhang@live.com
    5 '''
    6 import socket
    7 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    8 sock.connect(('127.0.0.1', 12345))
    9 #sock.send('Test\n')
    10 sock.send(raw_input("Please input : "))
    11 sock.close()

    三、go语言实现

    服务端代码:

     1 /*
    2 File : svr.go
    3 Author : Mike
    4 E-Mail : Mike_Zhang@live.com
    5 */
    6 package main
    7
    8 import(
    9 "net"
    10 "fmt"
    11 "bufio"
    12 )
    13
    14 func main() {
    15 client,err := net.Listen("tcp","127.0.0.1:12345")
    16 if err != nil {
    17 fmt.Printf("Error : %s\n",err.String())
    18 }
    19 for {
    20 if c, err := client.Accept(); err == nil {
    21 defer c.Close()
    22 line, _ := bufio.NewReader(c).ReadString('\n')
    23 fmt.Println(line)
    24 }
    25 }
    26 }

    客户端代码:

     1 /*
    2 File : cli.go
    3 Author : Mike
    4 E-Mail : Mike_Zhang@live.com
    5 */
    6 package main
    7
    8 import(
    9 "net"
    10 "fmt"
    11 )
    12
    13 func main() {
    14 conn, err := net.Dial("tcp", "127.0.0.1:12345")
    15 if err != nil {
    16 fmt.Printf("Error : %s\n",err.String())
    17 }
    18 conn.Write([]byte("Just a test"))
    19 }

    运行效果(go语言为例):

    好,就这些了,希望对你有帮助。

  • E-Mail : Mike_Zhang@live.com
  • 转载请注明出处,谢谢!
  • 相关阅读:
    Docker配置mysql
    Docker中部署Redis
    Linux上docker的安装
    tomcat启动报错:To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
    导出excel表格不能用ajax
    linux安装jdk
    第三次实验报告:使用Packet Tracer分析TCP连接建立过程
    第二次实验报告:使用Packet Tracer分析应用层协议
    第一次实验报告:使用Packet Tracer分析HTTP数据包
    PYTHON——多线程:队列Queue数据结构
  • 原文地址:https://www.cnblogs.com/MikeZhang/p/simpleTcpClientServerCppPythonAndGo.html
  • Copyright © 2020-2023  润新知