网络编程

一.客户端/服务器架构

UDP架构:

import socket
#创建一个udp协议下的socket,需要使用参数type
udp_server = socket.socket(type=socket.SOCK_DGRAM) #DGRAM : datagram  数据报
#拿到一个地址,启动程序的时候,告诉电脑,你给我这个程序分配8001端口.
ip_port = ('192.168.15.113',8001)
#绑定IP地址和端口
udp_server.bind(ip_port)

print('准备接收消息了...')
#接收消息,from_client_msg来自客户端的消息,client_addr客户端的地址('192.168.15.113', 8001)
from_client_msg,client_addr = udp_server.recvfrom(1024)  #阻塞住了
print(11111)
print(from_client_msg)
print(client_addr)
#发送消息
udp_server.sendto(b'gunduzi',client_addr)
#关闭udp的socket对象
udp_server.close()
服务端
import socket
udp_client = socket.socket(type=socket.SOCK_DGRAM)
server_ip_port = ('192.168.15.113',8001)

udp_client.sendto(b'hello',server_ip_port)

from_server_msg,server_addr = udp_client.recvfrom(1024)
print(from_server_msg)
print(server_addr)

udp_client.close()
客户端

TCP架构:

import socket

# 创建服务端socket对象
server = socket.socket()


# 绑定IP和端口
server.bind(('192.168.13.100',8000))

# 后边可以等5个人
server.listen(5)

print('服务端准备开始接收客户端的连接...')
# 等待客户端来连接,如果没人连接就一直等待
# conn是客户端与服务端连接的对象,服务端以后要通过该对象进行收发数据
# addr是客户端的地址信息
# 阻塞,只有客户端进行连接,则获取客户端连接然后开始进行通信
conn,addr = server.accept()

print('已经有人连接上了,客户端信息:',addr)

# 通过对象去获取(客户端发送的消息)
# 1024表示:服务端获取数据时,一次最多拿1024字节
data = conn.recv(1024)
print('收到消息:',data.decode('utf-8'))


# 服务端通过连接对象给客户端恢复一个消息
conn.send('赛利亚!你好,我是凯丽'.encode('utf-8'))

# 与客户端断开连接
conn.close()

# 关闭服务端的服务
server.close()
服务端
import socket

client = socket.socket()

# 客户端向服务端发起连接请求
# 阻塞,去连接,直到连接成功才会继续向下执行
client.connect(('192.168.13.100',8000))

# 连接上服务端后,向服务端发送消息
client.send('你好啊,我是赛利亚...'.encode('utf-8'))


# 等待服务端回复消息
data = client.recv(1024)
print(data.decode('utf-8'))

# 关闭自己(客户端)
client.close()
客户端

服务端套接字函数

s.bind() 绑定(主机,端口号)到套接字
s.listen() 开始TCP监听
s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来

客户端套接字函数
s.connect() 主动初始化TCP服务器连接
s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

公共用途的套接字函数
s.recv() 接收TCP数据
s.send() 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall() 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
s.recvfrom() 接收UDP数据
s.sendto() 发送UDP数据
s.getpeername() 连接到当前套接字的远端的地址
s.getsockname() 当前套接字的地址
s.getsockopt() 返回指定套接字的参数
s.setsockopt() 设置指定套接字的参数
s.close() 关闭套接字

面向锁的套接字方法
s.setblocking() 设置套接字的阻塞与非阻塞模式
s.settimeout() 设置阻塞套接字操作的超时时间
s.gettimeout() 得到阻塞套接字操作的超时时间

面向文件的套接字的函数
s.fileno() 套接字的文件描述符
s.makefile() 创建一个与该套接字相关的文件

二.OSI7层模型

 

三、简述 三次握手、四次挥手的流程

#三次握手:
   1.客户端(Client)向服务端(Server)发送一次请求
   2.服务端确认并回复客户端
   3.客户端检验确认请求,建立连接
#四次挥手:
   1.客户端向服务端发一次请求
   2.服务端回复客户端(断开客户端-->服务端)
   3.服务端再次向客户端发请求(告诉客户端可以断开了)
   4.客户端确认请求,连接断开

 

四、线程

import  time
import threading

def task(a,b,c):
    time.sleep(3)
    print('佩奇拿快递去')

def play():
    time.sleep(4)
    print('陪佩奇女友出去玩')

def ktv():
    time.sleep(5)
    print('陪alex女友唱歌去')


# 创建一个线程
# 让该线程去执行任务(函数)
n1 = threading.Thread(target=task,args=(1,2,3,))
# 开始执行
n1.start()

# 创建一个线程
# 让该线程去执行任务(函数)
n1 = threading.Thread(target=play)
# 开始执行
n1.start()


# 创建一个线程
# 让该线程去执行任务(函数)
n1 = threading.Thread(target=ktv)
# 开始执行
n1.start()

# 我坐家里打游戏
print('开黑,王者荣耀')
print('吃鸡,四黑有没有')
print('没有我一会再来')
初始线程
import time
import socket
import threading


def task(conn):
    time.sleep(20)
    data = conn.recv(1024)
    print(data)
    conn.close()

server = socket.socket()
server.bind(('192.168.13.100',8000,))
server.listen(5)

while True:
    conn,addr = server.accept()
    n = threading.Thread(target=task,args=(conn,))
    n.start()
socket和线程配合

 

五、进度条

def func(size,total_size):
    val = int(size/total_size * 100)
    time.sleep(0.05)
    print('\r%s%s%%'%('*'*val,val),end='')

for i in range(101):
    func(i,100)

 

posted @ 2018-09-12 21:31  一纸休书  阅读(136)  评论(0编辑  收藏  举报