0
点赞
收藏
分享

微信扫一扫

python笔记9--socket初步使用


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.


举报

相关推荐

0 条评论