python笔记9--socket初步使用

最近需要写个c/s小应用,因此看了下socket编程,把学习的笔记贴在此处以便于后续查阅。

1 介绍

本文主要介绍基本的socket C/S 编程案例,包括tcp案例和udp案例;

  • tcp 编程
    • 服务端主要流程
      socket()->bind()->listen()->accept()->read()->write()

    • 客户端主要流程
      socket()->connect()->write()->read()

      tcp server 通过accept来等待连接,当客户端连接后,就可以通过read读取数据,处理完后通过write发给对应客户端;
      tcp client 通过connect连接服务器,连接后通过write发送数据到server,并通过read接受数据;

  • udp 编程
    • 服务端主要流程
      socket()->bind()->recvfrom()->sendto()

    • 客户端主要流程
      socket()->sendto()->recvfrom()

      udp server 通过recvfrom等待客户端数据,当收到数据后进行处理并通过sendto发给对应客户端;
      udp client 建立socket后,直接通过 sendto 想server发送数据,并通过recvfrom接受数据;

2 源码案例

2.1 tcp c/s 案例

  • 客户端
    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    
    import socket
    
    
    def test_func():
        str_ret = socket.gethostbyname('localhost')
        print(str_ret)
        str_ret2 = socket.gethostbyname_ex(str_ret)
        print(str_ret2)
    
    
    def test_socket(host='127.0.0.1', port=1234):
        s = socket.socket()
        try:
            s.connect((host, port))
            data = 'I am client!'
            while data:
                s.send(data.encode('utf-8'))
                data = s.recv(1024)
                print('Receive Data from svr:', data.decode('utf-8'))
                data = input('please input client info(q->exit):\n')
                if data[0] == 'q':
                    break
        except socket.error as err:
            print('socket error: {0}'.format(err))
        finally:
            s.close()
    
    
    if __name__ == '__main__':
        print('I am socket client!')
        # test_func()
        test_socket('127.0.0.1', 1234)
    
  • 服务端
    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    
    import socket
    import datetime
    
    
    def test_func():
        str_ret = socket.gethostbyname('localhost')
        print(str_ret)
        str_ret2 = socket.gethostbyname_ex(str_ret)
        print(str_ret2)
    
    
    def test_socket(host='127.0.0.1', port=1234):
        s = socket.socket()
        s.bind((host, port))
        s.listen(5)
        client, addr = s.accept()
        print('client addr:', addr)
        while True:
            data = client.recv(1024)
            if not data:
                break
            print('Receive Data:', data.decode('utf-8'))
            str_send = 'I have received at ' +   datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
            client.send(str_send.encode('utf-8'))
        client.close()
        s.close()
    
    
    if __name__ == '__main__':
        print('I am socket server!')
        # test_func()
        test_socket('127.0.0.1', 1234)
    
  • 测试
    sever:
    $ python tcp_svr01.py 
    I am socket server!
    client addr: ('127.0.0.1', 45270)
    Receive Data: I am client!
    Receive Data: test tcp
    
    client:
    $ python tcp_client01.py 
    I am socket client!
    Receive Data from svr: I have received at 2020/02/15 17:49:21
    please input client info(q->exit):
    test tcp
    Receive Data from svr: I have received at 2020/02/15 17:49:30
    please input client info(q->exit):
    q
    

2.2 udp c/s 案例

  • 客户端
    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    
    import socket
    
    
    def test_socket(host='127.0.0.1', port=2234):
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        try:
            data = 'I am client!'
            while data:
                s.sendto(data.encode('utf-8'), (host, port))
                data, addr = s.recvfrom(1024)
                print('Receive Data from svr:', data.decode('utf-8'))
                data = input('please input client info(q->exit):\n')
                if data[0] == 'q':
                    break
        except socket.error as err:
            print('socket error: {0}'.format(err))
        finally:
            s.close()
    
    
    if __name__ == '__main__':
        print('I am udp socket client!')
        test_socket('127.0.0.1', 2234)
    
  • 服务端
    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    
    import socket
    import datetime
    
    
    def test_socket(host='127.0.0.1', port=2234):
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.bind((host, port))
    
        while True:
            data, addr = s.recvfrom(1024)
            if not data:
                break
            if data.decode('utf-8')[0] == 'q':
                break
            print('Receive Data:', data.decode('utf-8'))
            str_send = 'I have received at ' + datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
            s.sendto(str_send.encode('utf-8'), addr)
        s.close()
    
    
    if __name__ == '__main__':
        print('I am udp socket server!')
        test_socket('127.0.0.1', 2234)
    
  • 测试
    server:
    $ python udp_svr01.py 
    I am udp socket server!
    Receive Data: I am client!
    Receive Data: test udp
    
    client:
    $ python udp_client01.py 
    I am udp socket client!
    Receive Data from svr: I have received at 2020/02/15 17:59:14
    please input client info(q->exit):
    test udp
    Receive Data from svr: I have received at 2020/02/15 17:59:21
    please input client info(q->exit):
    q
    

3 说明

当前测试环境为Ubuntu1910,Python3.7.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昕光xg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值