# 访问新浪,接收新浪首页内容 import socket s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # AF_INET指定使用IPv4协议,SOCK_STREAM指定使用面向流的TCP协议 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: d = s.recv(1024) # 每次最多接收1k字节: if d: buffer.append(d) else: break data = b''.join(buffer) s.close header,html = data.split(b'\r\n\r\n',1) # 把HTTP头和网页分离一下,把HTTP头打印出来,网页内容保存到文件 print(header.decode('utf-8')) with open('sina.html','wb') as f: f.write(html)
# **************tcp服务端程序************** import socket,threading,time s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 创建一个基于IPv4和TCP协议的Socket s.bind(('127.0.0.1',9999)) # 监听端口 s.listen(5) # 调用listen()方法开始监听端口,传入的参数指定等待连接的最大数量 print('Waiting for connection') 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) while True: sock,addr = s.accept() # 接受一个新连接 t = threading.Thread(target=tcplink,args=(sock,addr)) # 创建新线程来处理TCP连接: t.start() # ****************tcp客户端程序**************** import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 建立连接: s.connect(('127.0.0.1', 9999)) # 接收欢迎消息: 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()
# ****************udp服务端程序************** # TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据。相对TCP,UDP则是面向无连接的协议\ # 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包。\ # 但是,能不能到达就不知道了 import socket s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # SOCK_DGRAM指定了这个Socket的类型是UDP s.bind(('127.0.0.1',9999)) # 绑定端口,绑定端口和TCP一样,但是不需要调用listen()方法,而是直接接收来自任何客户端的数据 print('Bind UDP on 9999...') while True: data,addr = s.recvfrom(1024) # recvfrom()方法返回数据和客户端的地址与端口,这样,服务器收到数据后,直接调用sendto()就可以把数据用UDP发给客户端 print('Received from %s:%s.' % addr) s.sendto(b'Hello,%s!'% data,addr) # 注意这里省掉了多线程,因为这个例子很简单 # *****************udp客户端********************** import socket s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 客户端使用UDP时,首先仍然创建基于UDP的Socket,\ # 然后,不需要调用connect(),直接通过sendto()给服务器发数据 for data in [b'Michael',b'Tracy',b'Sarsh']: s.sendto(data,('127.0.0.1',9999)) print(s.recv(1024).decode('utf-8')) s.close()