网络编程——基于TCP的网络应用程序
服务器
步骤 | 备注 |
---|---|
创建socket对象 | 关键字:AF_INET, SOCK_STREAM,其中,AF_INTE代表地址家族:因特网、SOCK_STREAM是socket模块中用来声明TCP套接字的关键字 |
绑定地址(HOST,PORT) | |
设置监听(listen) | 设置的监听数,连接被转接或拒绝前传入连接请求的最大数 |
设置一个无限循环的监听程序 | |
关闭连接 |
"""
时间戳服务器
"""
from socket import *
from time import ctime
HOST = ''
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST, PORT)
# 实例化sock对象
tcpServerSock = socket(AF_INET, SOCK_STREAM)
# 绑定地址
tcpServerSock.bind(ADDR)
# 设置最大监听数
tcpServerSock.listen(5)
while True:
print("waiting for connection.....")
# 接收连接信息
tcpCliSock, addr = tcpServerSock.accept()
print("...connected from:", addr)
while True:
# 接收TCP消息
data = tcpCliSock.recv(BUFSIZE)
if not data:
break
# 编码信息
message = '[{0}]{1}'.format(ctime(), data.decode('utf-8')).encode('utf-8')
tcpCliSock.send(message)
tcpCliSock.close()
tcpServerSock.close()
客户端
步骤 | 备注 |
---|---|
创建socket对象 | 同上 |
连接服务器(connect) | |
关闭连接 |
"""
时间戳客户端
"""
from socket import *
HOST = '127.0.0.1'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)
# 实例化sock对象
tcpCliSock = socket(AF_INET, SOCK_STREAM)
# 连接服务器
tcpCliSock.connect(ADDR)
while True:
data = input('>')
if not data:
break
tcpCliSock.send(data.encode('utf-8'))
data_recv = tcpCliSock.recv(BUFSIZ)
print(data_recv.decode('utf-8'))
注意事项:
-
传递消息的转换,网络之间的数据是bytes,所以在传递的时候要进行编码(string.encode(‘utf8’))
服务器端和客户端在接收消息的时候要进行解码(string.decode(“utf8”)); -
TCP网络应用程序是基于连接的;
-
服务器要先于客户端启动。(否则客户端程序无发连接到服务器)
网络编程——基于UDP的网络应用程序
服务器
步骤 | 备注 |
---|---|
创建socket对象 | AF_INET、SOCK_DGRAM |
绑定地址(HOST,PORT) | |
设置一个无限循环的监听程序 | |
关闭连接 |
from socket import *
from time import ctime
HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)
udpSerSocket = socket(AF_INET, SOCK_DGRAM)
udpSerSocket.bind(ADDR)
try:
while True:
print("waiting for connection ...")
data, addr = udpSerSocket.recvfrom(BUFSIZ)
message = '[{0}]{1}'.format(ctime(), data.decode('utf-8')).encode('utf-8')
udpSerSocket.sendto(message, addr)
print("connected from and returned to", addr)
udpSerSocket.close()
except EOFError and KeyboardInterrupt as ex:
raise ex
客户端
步骤 | 备注 |
---|---|
创建socket对象 | |
连接服务器(connect) | |
关闭连接 |
from socket import *
HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)
udpCliSock = socket(AF_INET, SOCK_DGRAM)
try:
while True:
data = input(">")
if not data:
break
udpCliSock.sendto(data.encode('utf-8'), ADDR)
data, ADDR = udpCliSock.recvfrom(BUFSIZ)
if not data:
break
print(data.decode('utf-8'))
udpCliSock.close()
except EOFError and KeyboardInterrupt as ex:
raise ex
注意事项:
- 传递消息的转换,网络之间传递的数据是bytes,所以在传递的时候要进行编码(string.encode(‘utf8’))
服务器端和客户端在接收消息的时候要进行解码(string.decode(“utf8”)); - UDP网络应用程序是基于无连接套接字的,客户端在发送请求之前,不需要提前连接服务器;
- 服务器和客户端的启动,没有特定的要求
这只是基础的网络编程帮助了解网络编程的基本原理,真正要实现一个基于UDP\TCP的网络应用程序还是比较困难和复杂的
一般开发网络应用程序比较Twisted框架,此框架很强大,包括网络协议、线程、安全性和身份验证、连天\IM、DBM\RDBMS数据库继承电子邮件、GUI集成工具包哦等等,这需要读者自己去学习和发现了~下边给一个介绍Twisted的工具
给一个介绍的连接 Twisted介绍——作者:宇宙浪子