32.网络编程TCP/UDP服务

网络编程TCP:


服务器端口了解:

  • port:0~65535
  1. web服务:80
  2. 邮箱服务:556
  3. 0~1024:为服务默认的公认端口,一般我们不能用

套接字:socket

  • socket作用
  1. ip:port,有协议加持绑定了IP属性,协议属性变量
  • 一般步骤模型如下:

import socket
服务端:
s = socket.socket(IP类型是啥,协议类型是啥)
  # ip类型:
  # socket.AF_INET ipv4的
  # socket.AF_INET6 ipv6的
  # 协议:
  # socket.SOCK_STREAM TCP协议的
  # socket.SOCK_DGRAM UDP协议的 
s.bind( (ip,port) ) #绑定可用IP和端口
  # ip可以是一个空字符串,代表所有可用IP
  # 公网IP 47.98.190.149
  # 私网IP 172.16.253.97
  # 本地回环 127.0.0.1
s.listen(5) # 服务器开启监听
  #参数:连接等待个数
c,addr = s.accept() # 阻塞 等待别人连接,阻塞会有两个返回值, 第一个是套接字 第二个是来访者的ip和端口的元组
  # c:套接字
  # addr:来访者IP和端口的元组
c.recv(1024)
  # 参数:你一次性拿取对方传递来的多少数据,字节单位
c.send(data.encode())
  # data: 编码过后的字符串对象 (二进制)
s.close() #关闭套接字
c.close() #关闭套接字

客户端:
s = socket.socket(IP类型是啥,协议类型是啥)
  #初始化定义ip协议类型
s.connect( (ip,port) )
  #客户端通过IP和端口的元组连接服务器
s.recv(1024)
  # 参数:你一次性拿取对方传递来的多少数据,字节单位
s.send(data.encode())
  # data: 编码过后的字符串对象 (二进制)
s.close() #关闭套接字

 下面是根据上面的socket编写以tcp协议简单的单线程聊天代码:(单线程只能1对1)


server端:
import socket
ip = ''     #这里可以为空代表所有ip都可以用
port = 8082
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #绑定属性ipv4,tcp协议
s.bind((ip,port)) #绑定可用ip和端口
s.listen(5)     #允许5台客户端连接
while True:
    try:
        c,addr = s.accept() #阻塞 等待别人连接,没有人连我就不执行下面的代码,一般生产环境用的都是非阻塞的
        print(c)
        print(addr)
        while True:
            #阻塞会有两个返回值,下面服务阻塞返回的c
            date = c.recv(1024) #接收客户端的数据,1024字节单位
            if date:
                print('[%s]发来的消息:%s' % (addr,date.decode('utf-8')))
                while True:  #这里循环的是输入空数据是无限循环
                    msg = input('>>>')  #输入你要发送的数据          
                    if msg:
                        c.send(msg.encode('utf-8')) #向客户端发送数据
                        break
                    else:
                        print('不能输入空数据,请从新发送')
            else:
                print('客户端已经关闭')
                c.close()
                break
    except KeyboardInterrupt:#ctrl + c 终结程序
        s.close()
        break
print('服务已关闭') 

clitent端:

import socket
ip = '192.168.137.128'
port = 8082
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #绑定属性ipv4,tcp协议 
s.connect( (ip,port)) #客户端通过IP和端口的元组连接服务器
while True:
    try:
        msg = input('>>>')
        if msg:
            s.send(msg.encode('utf-8'))  #向服务端发送数据
        else:
            print('不能发送空数据,请从新输入')
            continue
        date = s.recv(1024)
        if date:
            print('服务器返回的数据:',date.decode('utf-8'))
        else:
            print('服务端已经关闭')
            s.close()
            break
    except KeyboardInterrupt: #ctrl + c
        s.close()
        break
print('客户端已关闭')

运行结果:

 

   

网络编程UCP:


套接字:socket

  • 一般步骤模型如下:

import socket
服务端:
s = socket.socket(IP类型是啥,协议类型是啥)
  # ip类型:
  # socket.AF_INET ipv4的
  # socket.AF_INET6 ipv6的
  # 协议类型:
  # socket.SOCK_STREAM TCP协议的
  # socket.SOCK_DGRAM UDP协议的 
s.bind( (ip,port) ) #UDP服务器只需要绑定自身可用IP和端口即可
  # ip可以是一个空字符串,代表所有可用IP
  # 公网IP 47.98.190.149
  # 私网IP 172.16.253.97
  # 本地回环 127.0.0.1
data,c_addr = s.recvfrom() #获取这个套接字接受到的数据
     #data:发来的数据
     #c_addr:谁发来的
 
s.sendto(msg,c_addr) #回复消息

udp客户端:
socket(AF_INET,SOCK_DGRAM) #(IP类型是啥,协议类型是啥)

c.sendto(msg,s_addr) #发消息给服务端

data,s_addr = c.recvfrom() #服务端返回的数据

下面是根据上面的socket编写以udp协议简单的多线程聊天代码:(1对多个客户端)


server:

import socket
ip = ''                         #默认允许所有的ip
port = 8083                 #服务器开通的端口
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)    #初始化ip协议类型
s.bind((ip,port))                   #绑定服务ip端口
while True:
    try:
        while True:
            date,c_addr = s.recvfrom(1024)         #接受客户端发来的消息
            print('%s:%s' % (c_addr,date.decode('utf-8')))
            while True:
                msg = input('>>>> ')
                if msg == 'quit' or msg == 'q':
                    s.close()
                    print('服务端已关闭')
                    exit()
                if msg:
                    s.sendto(msg.encode('utf-8'),c_addr)          #向客户端返回消息
                    break
                else:
                    print('不能回复为空,请从新回复消息')
    except KeyboardInterrupt:
            break
s.close()
print('服务端已关闭')

client:

import socket
ip = '192.168.137.128'          #服务器ip
port = 8083                   #服务器端口
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #绑定属性ipv4,udp协议 
while True:
    try:
        msg = input('>>> ')               #输入要发送的消息
        if msg == 'quit' or msg == 'q':
            break
        if msg:
            s.sendto(msg.encode('utf-8'),(ip,port))   #想服务器发送消息
        else:
            print('消息不能为空,请从新回复')
        date,c_addr = s.recvfrom(1024)            #接受服务器返回的消息
        print('%s:%s' % (c_addr,date.decode('utf-8')))
    except KeyboardInterrupt:
        break
s.close()
print('客户端已经关闭')

运行结果:

server端:

 

client1:

client2:

 

 

原文地址:https://www.cnblogs.com/zhangan/p/10108837.html