python 学习day19 网络通信

# 访问新浪,接收新浪首页内容
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()

猜你喜欢

转载自www.cnblogs.com/perfey/p/9317293.html