TCP编程:
创建一个基于TCP的socket
import socket
# 创建一个socket:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接:
s.connect(('www.sina.com.cn', 80))
s.send(b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n')
buffer = []
while True:
# 每次最多接收1k字节:
d = s.recv(1024)
if d:
buffer.append(d)
else:
break
data = b''.join(buffer)
s.close()
header, html = data.split(b'\r\n\r\n', 1)
print(header.decode('utf-8'))
with open('D:\sina.html', 'wb') as f:
f.write(html)
创建Socket
时,AF_INET
指定使用IPv4协议,如果要用更先进的IPv6,就指定为AF_INET6
。SOCK_STREAM
指定使用面向流的TCP协议,这样,一个Socket
对象就创建成功,但是还没有建立连接。
用connect进行连接,第一个参数是网址,可以自动被解析到IP地址,第二个参数是端口号,服务器提供什么样的服务端口号就必须固定下来,这些端口号在网上是可以查到的。connect参数是一个truple
=(address,port).
建立连接后用send方法发送连接,写一个while循环持续接收返回的信息,知道信息发完
端口号小于1024的都是Internet标准服务的端口号,端口号大于1024可以任意使用
服务器编程:
创建socket-->绑定端-->监听端口-->连接后创建线程-->socket关闭
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定端口:
s.bind(('127.0.0.1', 9999))
监听端口
s.listen(5) #参数为等待连接的最大数量
print('Waiting for connection...')
while True:
# 接受一个新连接:
sock, addr = s.accept() #accept返回的第一个参数是套接字对象,之后用这个套接字对象来接收和发送信息,第二个参数客户端的地址(注意着里跟UDP的不同)
# 创建新线程来处理TCP连接:
t = threading.Thread(target=tcplink, args=(sock, addr))
t.start()
def tcplink(sock, addr):
print('Accept new connection from %s:%s...' % addr)
sock.send(b'Welcome!')
while True:
data = sock.recv(1024)
time.sleep(1)
if not data or data.decode('utf-8') == 'exit':
break
sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
sock.close()
print('Connection from %s:%s closed.' % addr)
客户端编程
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接:
s.connect(('127.0.0.1', 9999)) #connect参数是一个truple注意些括号
# 接收欢迎消息:
print(s.recv(1024).decode('utf-8'))
for data in [b'Michael', b'Tracy', b'Sarah']:
# 发送数据:
s.send(data)
print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()
注意:socket传输信息的时候用二进制b,不能用字符串
UDP编程:
CP是建立可靠连接,并且通信双方都可以以流的形式发送数据。相对TCP,UDP则是面向无连接的协议。使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包。但是,能不能到达就不知道了。虽然用UDP传输数据不可靠,但它的优点是和TCP比,速度快,对于不要求可靠到达的数据,就可以使用UDP协议。
服务器编程
import socket
s =socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(('127.0.0.1',9998))
print('bind UDP on 9998')
while(True):
data , addr= s.recvfrom(1024) #recvfrom 返回接收到的数据 以及 地址与端口
print('receive from %s:%s' % addr)
s.sendto(b'hello %s' %data,addr)
客户端编程:
import socket
s =socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(('127.0.0.1',9998))
print('bind UDP on 9998')
while(True):
data ,addr= s.recvfrom(1024)
print('receive from %s:%s' % addr)
s.sendto(b'hello %s' %data,addr) #sendto 的第二个参数是目标的
从上面可以看出与tcp连接的不同,TCP连接accept是套接字对象和地址信息,而UDP接收的是内容
发送的方法也不同,TCP是直接发送信息,因为已经建立链接了,而UDP是要传入内容和地址两个参数
总结下:
TCP连接中:先建立连接然后再互相发送信息,建立连接后不再需要地址信息
UDP连接中:对着地址发送信息,不会建立连接