python网络编程

python网络编程


UDP、TCP协议编程

  • UDP主要特点:

    1. 无连接;
    2. 尽最大努力交付
    3. 面向报文
    4. 无拥塞控制
    5. 首部开销小
    6. 支持一对一,一对多,多对一,多对多的交互通信
  • UDP优点传输快,适用视频在线点播,网络语音通话等

  • TCP特点:

    1. 面向连接
    2. 每个TCP连接点对点(一对一)
    3. 可靠的传输服务
    4. 全双工通信(手机)
    5. 面向字节流
  • TCP适用文件传输,电子邮件等,需要建立连接,数据传输,断开连接三个步骤。

  • socket(套接字):两个端点的程序之间的“信息通道”

    • 服务器套接字和客户端套接字。

    • socket模块:

      创建套接字

      ​ s=socket.socket(socket_family,socket_type,protocol)

      ​ family可以为socket.AF_INET表示IPV4,socket.AF_INET6表示IPV6

      ​ type为SOCK_STREAM表示TCP协议SOCK_DGRAM表示UDP协议

      服务器端套接字方法

      s.bind()将地址(ip,端口号)绑定到套接字

      s.listen()设置并启动TCP监听

      s.accept()被动接受TCP客户端连接,等待直到连接到达

      客户端套接字方法

      s.connet()主动启动TCP服务连接

      通用套接字方法

      s.recv()接受TCP消息

      s.send()发送TCP消息

      s.recvfrom()接受UDP消息

      s.sendto()发送UDP消息

      s.close()关闭套接字

      socket.gethostname()返回主机名

UDPserver代码

#服务器端接收数据
import socket
from _socket import SOCK_DGRAM
#创建socket对象
s=socket.socket(socket.AF_INET,SOCK_DGRAM)
#地址绑定
s.bind(('127.0.0.1',50000))#IP+端口元组
#接收数据
while True:
    date,addr=s.recvfrom(1024)
    if date.decode()=='bye':
        break
    print('received message:%s from %s on %s' %(date.decode(),addr[0],addr[1]))
s.close()

UDPclient代码

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto('hello'.encode(),('127.0.0.1',50000))#从命令行获取,内容+地址
s.close()

结果

在cmd下先运行server.py程序,在执行client可以看见server上面显示‘hello’

image-20191104221114872

image-20191104221134394

  • 如果想要直接从命令行输入并显示

    client代码

    import socket
    import sys
    s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    for i in sys.argv[1:]:
        x=i
        s.sendto(x.encode() ,('127.0.0.1',50000))#从命令行获取,内容+地址
    s.close()

    此时我可以在client命令行下输入,结果在server上显示(如图所示)

    image-20191104224509962

    image-20191104224528638

    【注释】sys.argv[]相当于从程序外部获取参数的桥梁,看做一个list就行,里面的项就是用户输入的参数。

    【温馨提示】每次改完代码要记得保存哦!

TCP server代码

import socket
servers=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
servers.bind(('127.0.0.1',60000))#绑定套接字
servers.listen(5)#TCP监听
print('server is waiting for connection...')
clients,addr=servers.accept()#接受客户端请求
print('connect by %s' %addr[0])
data=clients.recv(1024).decode()#1024为最大值,接收数据
print('recevied message %s ' %data)
clients.send(('hello:%s' %data).encode())#发送数据
clients.close()
servers.close()

TCPclient代码

import socket
cs=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
cs.connect(('127.0.0.1',60000))
cs.send('Mary'.encode())
data=cs.recv(1024)
print('receviced sendback:%s' %data.decode())
cs.close()

结果

image-20191104225347397

image-20191104225421494

image-20191104225445581

image-20191104225502205

错误提示和改进

image-20191104220934795

解决办法:任务管理器下直接结束pyhton程序

简单的serverclient通信

TCPserver代码

import socket
import sys
from _socket import AF_INET, SOCK_STREAM
s=socket.socket(AF_INET,SOCK_STREAM)
s.bind(('127.0.0.1',50000))
s.listen(5)
print('wating for you....')
clients,addr=s.accept()
print('connect by %s' %addr[0])
while True:
    data=clients.recv(1024).decode()
    print(data)
    x=input('server:')
    if x=='bye':
        break
    clients.send(x.encode())
clients.close()
s.close()

TCPclient代码

import socket
import sys
from _socket import AF_INET, SOCK_STREAM
cs=socket.socket(AF_INET,SOCK_STREAM)
cs.connect(('127.0.0.1',50000))
while True:
    x=input('client:')
    if x=='bye':
        break
    cs.sendall(x.encode())
    data=cs.recv(1024).decode()
    print(data) 
cs.close()

【缺点】只能一人说一次。


   转载规则


《python网络编程》 刘珊 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录