30 tcp编码, udp编码 pycharm输出带颜色, tcp实现的聊天室

主要内容:

  发送端一次性发送的数据,从发送端的缓存区发送给接收方的操作系统中(即缓存区),

  接收方直接要数据从自己的操作系统中,不会接收一次(在没有接收完的情况下)就像发送方要一次.从而提高了网络传输的效率.

1. tcp协议及编码

  a : 回环地址 : 127.0.0.1   每个计算机都有这个回环地址,只能被本机识别,不能被其他机器识别.

  b : 用tcp 实现一个聊天室

    服务器端:

import socket
sk = socket.socket()# 默认参数  使用基于网络类型的套接字,TCP协议
sk.bind(('127.0.0.1',65534))# 回环地址
sk.listen()
while 1:
    conn,addr = sk.accept()# 接电话
    while 1:
        msg_r = conn.recv(1024).decode('utf-8')
        print(msg_r)
        if msg_r == 'q':
            break                      # 如果发送q结束客户端的程序,服务器并不结束,需要在接收方加上if语句.
        msg_s = input('>>>')
        conn.send(msg_s.encode('utf-8'))
        if msg_s == 'q':               #如果接收到服务器的传来的q结束程序.
            break
    conn.close()
sk.close()

    客户端:

import socket
sk = socket.socket()
sk.connect(('127.0.0.1',65534))
while 1:
    msg_s = input('>>>')
    sk.send(msg_s.encode('utf-8'))
    if msg_s == 'q':
        break
    msg_r = sk.recv(1024).decode('utf-8')
    if msg_r == 'q':
        break
    print(msg_r)
sk.close()

    tcp协议的三次握手 , 四次挥手:

      三次挥手 : @ 一定是客户端先发起请求

        1) :客户端发起请求: 请求连接服务器(我想连接你)

        2) :服务器返回 : 接收到请求, 并要求连接客户端

        3) :客户端 : 可以连接了.

      四次挥手: @四次挥手的过程,第一次请求谁先发送都可以

        1) :客户端发起断开连接的请求 : (我想和你断开了,我没有数据要发送了,但是,如果你有数据没发完,你就继续发就可以了,我可以继续接收)

        2) :服务器回复 : 我接收到你的请求了,我马上着手准备断开

        3) :服务器回复 : 我已经准备好断开连接了.

        4) :客户端回复 : 收到你的信息,可以断开了.

  c : pycharm输出带颜色

    1) : 格式设置颜色开始 :33[前景色;背景色m

        不设置背景色 :  33[显示颜色m

    2) :格式设置结束 :           33[0m         采用终端默认设置,即取消颜色设置

    3) : 前景色:30  背景色: 40 代表黑色 31,红色  32, 绿色 33, 黄色, 34, 蓝色, 35, 紫红色, 36,青蓝色, 37白色.

print('33[35m欢迎使用学生选课系统33[0m')
try :
    num = int(input('请输入数字选择功能:'))
except Exception as e:
    print('33[31m输入的内容有误,请重新输入33[0m') 

  d : udp协议

    服务器端 :

import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',8787))
msg, addr = sk.recvfrom(1024)
print(msg.decode('utf-8'),addr)
sk.close()

    客户端 :

import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.sendto('你好a'.encode('utf-8'),('127.0.01',8787))
sk.close()

    注意 : 收发信息的过程,一定是客户端先发,要不然会出现错误.即服务器端先发,不知道把信息发给谁.

    带署名的udp协议:服务器端:

import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',8787))
dic = {'alex':'33[31m','sylar':'33[34m'}
while 1:
    msg, addr = sk.recvfrom(1024)
    msg_d = msg.decode('utf-8')
    name = msg_d.split(':')[0].strip()
    color = dic.get(name, '')
    print('%s%s33[0m' % (color,msg_d))
    msg_s = input('>>>:').encode('utf-8')
    sk.sendto(msg_s, addr)
sk.close()

    客户端: 

import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
name = input('请输入你的姓名: ')
while 1:
    msg_s = input('请输入聊天的内容:')
    msg_s = name + ':' + msg_s
    sk.sendto(msg_s.encode('utf-8'),('127.0.01',8787))
    msg, addr = sk.recvfrom(1024)
    print(msg.decode('utf-8'))
sk.close()

  e : 解决编码解码问题

  先建一个类:

import socket
class MySocket(socket.socket):# 继承自 socket文件中的socket类,此时socket就是父类
    def __init__(self,encoding='utf-8'):
        self.encoding = encoding
        super(MySocket, self).__init__(type=socket.SOCK_DGRAM)#  执行父类socket中的__init__方法

    def my_sendto(self,msg,addr):
        return self.sendto(msg.encode(self.encoding),addr)# 调用父类中的sendto方法

    def my_recvfrom(self,num):
        msg_r,addr = self.recvfrom(num)# 调用父类的recvfrom方法
        return msg_r.decode(self.encoding),addr

  服务器端:

from My_UDP import MySocket
sk = MySocket()
sk.bind(('127.0.0.1',8080))
msg,addr = sk.my_recvfrom(1024)
print(msg)
sk.close()

  客户端:

from My_UDP import MySocket
sk = MySocket()
sk.my_sendto('abcabc中国',('127.0.0.1',8080))
sk.close()

  

原文地址:https://www.cnblogs.com/gyh412724/p/9469961.html