python网络编程.init()

python网络编程

入门

创建套接字,使用socket.socket()函数

1
socket(socket_family=AF_INET, socket_typeSOCK_STREAM, protocol=0)
  • socket_family是AF_UNIX(面向文件)或AF_INET(面向网络)。
  • sockey_type是SOCK_STREAM(面向连接的流套接字)或SOCK_DGRAM(无连接,成本低廉)
  • protocol一般默认为0

服务器简单设计伪代码:

1
2
3
4
5
6
7
8
9
ss = socket()			# create
ss.bind() # 绑定地址
ss.listen() #监听连接
inf_loop:
cs, addr = ss.accept() #无限循环等待客户端连接
comm_loop:
cs.recv()/cs.send() #通信
cs.close()
ss.close()

调用accept()函数,开启了一个简单的单线程服务器。accept()是阻塞的,他将被暂停直到connection.然后就能获得一个临时套接字cs,随后通信就可以开始。

转化成py代码(只适用于IPv4)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from socket import *
from time import ctime

HOST = ''
PORT = 21567
BUFSIZ= 1024
ADDR = (HOST, PORT)

with socket(AF_INET, SOCK_STREAM) as s:
s.bind(ADDR)
s.listen(5)
print('wait')
while True:
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(BUFSIZ)
if not data: break
conn.sendall(data)

客户端简单设计伪代码:

1
2
3
4
5
cs = socket()
cs.connect()
comm_loop:
cs.send()/cs.recv()
cs.close()

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from socket import *

HOST = 'localhost'
PORT = 21567
BUFSIZ= 1024
ADDR = (HOST, PORT)

with socket(AF_INET, SOCK_STREAM) as s:
s.connect(ADDR)
while True:
data = input('>:')
if not data:
data = 'haha,huchi'
s.send(data.encode())
data = s.recv(BUFSIZ)
if data:
print(data.decode())

首先运行服务器端程序,再运行客户端程序。

UDP服务器伪代码:

1
2
3
4
5
ss = socket()
ss.bind()
inf_loop:
cs = ss.recvfrom()/ss.sendto()
ss.close()

transform:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from socket import *

HOST = ''
PORT = 21567
BUFSIZ= 1024
ADDR = (HOST, PORT)

with socket(AF_INET, SOCK_DGRAM) as s:
s.bind(ADDR)
while True:
print("waiting for message")
data, addr = s.recvfrom(BUFSIZ)
if data:
print('Connected by', addr)
s.sendto(data, addr)

UDP客户端伪代码:

1
2
3
4
cs = socket()
comm_loop:
cs.sendto()/cs.recvfrom()
cs.close()

transform:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from socket import *

HOST = 'localhost'
PORT = 21567
BUFSIZ= 1024
ADDR = (HOST, PORT)

with socket(AF_INET, SOCK_DGRAM) as s:
while True:
data = input(">:")
if not data: break
s.sendto(data.encode(), ADDR)
data, ADDR = s.recvfrom(BUFSIZ)
if not data: break
print(data.decode())

运行后也能实现相互交流

SocketServer模块初识

它简化了很多样板代码。

TCP服务器代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from socketserver import (TCPServer, StreamRequestHandler as SRH)

HOST = ''
PORT = 21567
BUFSIZ= 1024
ADDR = (HOST, PORT)

class MyTCPHandler(SRH):

def handle(self):
print("waiting...")
self.data = self.request.recv(BUFSIZ).strip()
print("{} wrote".format(self.client_address[0]))
print(self.data)
#回复
self.wfile.write(self.data.upper())

if __name__ == "__main__":
server = TCPServer(ADDR, MyTCPHandler)
server.serve_forever()
server.close()

写一个客户端测试一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from socket import *

HOST = 'localhost'
PORT = 21567
BUFSIZ= 1024
ADDR = (HOST, PORT)
data = "Hello huchi"

with socket(AF_INET, SOCK_STREAM) as s:
s.connect(ADDR)
s.sendall(bytes(data + "\n",'utf-8'))

received = str(s.recv(BUFSIZ), "utf-8")

print("sent: {}".format(data))
print("received:{}".format(received))

Twisted 初识

Twisted也是一款完整的事件驱动的网络框架,他提供了大量的支持来建立完整的系统(网络协议、线程、安全性、身份验证、聊天/IM(及时通信)、DBM及RDBMS(关系数据库管理系统)、web、电子邮件、命令行参数、GUI集成工具包).

尴尬,ubuntu挂掉了,windows也没成功装twisted,等考完试再写。。。。

参考链接:

  1. 菜鸟
  2. Socket Document
  3. SocketServer Document
  4. Twisted Document

遗留作业:

  1. 逐步实现半双工聊天,全双工聊天,多用户双工聊天,多房间多用户全双工聊天。
  2. 了解并研究不同的异步系统。如twisted,Greenlets,Tornado,Diesel,Concurrence,Eventlet,Gevent.
文章目录
  1. 1. python网络编程
    1. 1.1. 入门
    2. 1.2. SocketServer模块初识
    3. 1.3. Twisted 初识
  2. 2. 参考链接:
  3. 3. 遗留作业:
|