TCP
一般网络连接都是可靠的TCP连接,创建该连接时,将发起连接的称为客户端,而被动连接的叫服务端。
客户端
创建客户端连接
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('xxx', prot))
创建socket 连接时的参数说明:
socket.AF_INET 说明遵循IPV4 协议,如要使用IPV6 协议,将参数改为socket.AF_INET6 socket.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()
服务端
服务端编程要比客户端编程更复杂。
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
绑定端口,监听来自其他客户端的连接。
s.bind(('ip', prot))
- 0.0.0.0可绑定到所有的网络地址。
- 127.0.0.1可绑定本机地址,如绑定该
IP ,只有本机的客户端能连接到服务端。 - 小于1024端口需要管理员权限才能绑定。
调用s.listen(n) 方法来监听连接。
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)
if not data or data.decode('utf-8') == 'exit':
break
sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
sock.close()
|