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.