python网络编程

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_INET6SOCK_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连接中:对着地址发送信息,不会建立连接

你可能感兴趣的:(python网络编程)