TCP
一般网络连接都是可靠的TCP连接,创建该连接时,将发起连接的称为客户端,而被动连接的叫服务端。
客户端
创建客户端连接
# 导入socket模块
import socket
# 创建一个socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接。参数是元组形式,包含域名和端口
s.connect(('xxx', prot))
创建socket连接时的参数说明:
socket.AF_INET说明遵循IPV4协议,如要使用IPV6协议,将参数改为socket.AF_INET6socket.SOCK_STREAM意为指定使用面向流的TCP协议
对端口的说明:
- 80端口是web服务的标准端口
- 25端口是STMP服务的标准端口
- 端口号小于1024的是
internet端口,大于1024的可以任意使用。
发送请求
建立连接之后,就可以发送请求。
s.send('xxxx')
发送的文本格式必须符合HTTP标准。
发送完之后就可以等待服务器返回内容了。
接收返回内容
buffer=[]
while True:
d = s.recv(1024)
if d:
buffer.append(d)
else:
break
data = ''.join(buffer)
接收返回的内容时,需要用recv(max)来限制接收数据的字节数,然后在while循环中,反复接收,直到接收到的数据为空,跳出循环。
关闭连接
s.close()
服务端
服务端编程要比客户端编程更复杂。
# 首先依旧是创建socket
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
绑定端口,监听来自其他客户端的连接。
# .bind()方法,绑定端口和网络地址
s.bind(('ip', prot))
- 0.0.0.0可绑定到所有的网络地址。
- 127.0.0.1可绑定本机地址,如绑定该
IP,只有本机的客户端能连接到服务端。 - 小于1024端口需要管理员权限才能绑定。
调用s.listen(n)方法来监听连接。
# 设置最大等待连接数量为5
s.listen(5)
print('Waiting for connectiong......)
接受客户端的连接
while True:
# 接收一个新连接
sock, addr = s.accept()
# 建立线程来处理连接
t = threading.Threading(target=tcplink, args=(sock, addr))
t.start()
def tcplink(sock, addr):
print('Accept new connection from %s:%s...'% addr)
# 连接建立后,先发送一条问候信息
sock.send('Welcome!')
while True:
data = sock.recv(1024)
# 如果接收的请求是空的或者为exit,就断开连接
if not data or data.decode('utf-8') == 'exit':
break
sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
sock.close()
510

被折叠的 条评论
为什么被折叠?



