乐之之

知而行乐,乐而行之,天道酬勤,学无止境。
web网络编程基础(下)

网络编程基础(2)

一、UDP套接字的示例

1、udp简单示例

  • udp服务端
import socket
ip_port = ('127.0.0.1', 9000)

# 创建一个服务器的套接字
udp_server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

# 绑定服务器套接字
udp_server.bind(ip_port)

# 接受客户端的信息
msg, addr = udp_server.recvfrom(1024)
print(msg.decode(), addr)

# 发送信息
udp_server.sendto("hello".encode(), addr)
  • udp客户端
import socket
ip_port = ('127.0.0.1', 9000)

# 创建一个客户端套接字
udp_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 输入发送的数据
msg = input('>>: ').strip()

# 发送信息给服务器
udp_client.sendto(msg.encode('utf-8'), ip_port)

# 接受服务器的信息
back_msg, addr = udp_client.recvfrom(1024)
print(back_msg.decode('utf-8'), addr)

效果示例:

  • udp_client
  • 输入信息发送至服务端,发送后,接收到服务端的信息。

  •  udp_server
  • 接收到客户端的信息,并向客户端发送信息。

2、udp聊天器示例

  • udp服务器
import socket
ip_port = ('127.0.0.1', 8081)
# 创建一个服务器套接字
udp_server_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定IP地址和端口号
udp_server_sock.bind(ip_port)

# 循环收发消息
while True:
    # 接收
    qq_msg, addr = udp_server_sock.recvfrom(1024)
    print('来自[%s:%s]的一条消息:%s' % (addr[0], addr[1], qq_msg.decode('utf-8')))
    # 发送
    back_msg = input('回复消息: ').strip()
    udp_server_sock.sendto(back_msg.encode('utf-8'), addr)
  • udp客户端
import socket

udp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

qq_name_dic = {
    '张三': ('127.0.0.1', 8081),
    '李四': ('127.0.0.1', 8082),
    '王五': ('127.0.0.1', 8083),
    '赵六': ('127.0.0.1', 8084),
}

while True:
    qq_name = input('请选择聊天对象: ').strip()
    if qq_name == "quit":
        break
    while True:
        msg = input('请输入消息,回车发送: ').strip()
        if msg == 'quit':
            break
        if not msg or not qq_name or qq_name not in qq_name_dic:
            continue
        udp_client_socket.sendto(msg.encode('utf-8'), qq_name_dic[qq_name])

        back_msg, addr = udp_client_socket.recvfrom(1024)
        print('来自[%s:%s]的一条消息:%s' % (addr[0], addr[1], back_msg.decode('utf-8')))

 效果示例:

  • udp_clientchat

  • udp_serverchat1
  • 可以建立多个服务器进行监听,这里就以两个为例

  • udp_serverchat2

 

二、TCP套接字示例

  • tcp是基于连接的,必须先启动服务器,然后再启动客户端去连接服务器。

1、tcp简单示例

  • tcp服务端
import socket

ip_port = ('127.0.0.1', 9000)  # 电话卡

# 创建服务器套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 把地址绑定给套接字
s.bind(ip_port)
# 监听链接
s.listen(5)

# 接受客户端连接
conn, addr = s.accept()
# print(conn)
# print(addr)
print('接到来自%s的电话' % addr[0])

# 对话
msg = conn.recv(1024)
print(msg.decode(), type(msg))
conn.send("hi".encode())

conn.close()  # 关闭客户端套接字
s.close()  # 关闭服务器套接字
  • tcp客户端
import socket

ip_port = ('127.0.0.1', 9000)

# 创建客户端套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 尝试连接服务器
s.connect_ex(ip_port)

#对话
s.send('hello world'.encode('utf-8'))
feedback = s.recv(1024)
print(feedback.decode('utf-8'))

# 关闭客户端套接字
s.close()

效果示例:

  • tcp_client

  • tcp_server

2、tcp改进示例

  • tcp服务端改进版
import socket
ip_port = ('127.0.0.1', 8081)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(ip_port)
s.listen(5)

while True:
    conn, addr = s.accept()
    # print(conn)
    # print(addr)
    print('接到来自%s的电话' % addr[0])
    while True:
        msg = conn.recv(1024)
        print(msg.decode(), type(msg))
        str = input(">>>")
        conn.send(str.encode())
    conn.close()
  • tcp客户端改进版
import socket
ip_port = ('127.0.0.1', 8081)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect_ex(ip_port)

while True:
    msg = input('>>: ').strip()
    if len(msg) == 0:
        continue
    if msg == "quit":
        break
    s.send(msg.encode('utf-8'))

    feedback = s.recv(1024)
    print(feedback.decode('utf-8'))

s.close()

 效果示例:

  • tcp_clientcaht

  • tcp_servercaht

三、tcp的三次握手四次挥手(面试常考)

  流程图

  • 术语

    • SYN:同步位,SYN=1,表示进行一个连接请求。

    • ACK:确认位,ACK=1,确认有效,ACK=0,确认无效。

    • ack:确认号,对方发送序号+1。

    • seq:序号。

    • FIN:断开连接并且会停止发送数据。

1、TCP建立连接进行三次握手的具体过程。

  (1)第一步:发送方发送同步序列号标号SYN seq=x

  (2)第二步:接收方发送同步序列标号SYN seq=y和确认包ACK x+1

  (3)第三步:发送方发送确认包ACK y+1 连接建立成功

2、TCP断开连接的具体过程

  (1)第一步:客户端关闭客户到服务器的数据传送,发送给服务端一个FIN seq=x

  (2)第二步:服务器收到这个FIN ,发回一个ACK x+1,确认序号为收到的序号加1

  (3)第三步:服务器关闭客户端的连接,发送给客户端一个FIN seq=y

  (4)第四步:客户端发回ACK y+1报文确认,确认序号设置为收到序号加1

3、TCP为什么连接是3次,断开是4次?

  答:TCP在连接时需要客户端与服务器双方互相进行确认,是没有数据传输的。但在连接之后是有数据传输的,需要保证数据传输安全,即数据传输是否完毕,所以在第二次挥手时进行确认是否传输完毕,等待传输完毕后再向客户端发送服务器方具备断开连接请求的条件信息。然后待客户端确认,即断开连接。

posted on 2023-03-14 21:06  乐之之  阅读(13)  评论(0编辑  收藏  举报