python笔记9--socket初步使用
- 1 介绍
- 2 源码案例
- 2.1 tcp c/s 案例
- 2.2 udp c/s 案例
- 3 说明
最近需要写个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.