socket tcp

1.socket

   套接字,本质上是一个模块,里面封装了一些网络通讯协议 是处于传输层和应用层之间的一个抽象层,实际在OSI中并不存在 也就是没有socket也能能够通讯 ,但是这样一来 我们必须完全按照OSI规定的各种协议来编码 这是一个重复,复杂的过程,为了提高开发效率,就出现了socket模块,专门帮我们封装了传输层以下的一堆协议 有socket模块之后 当我们需要编写网络通讯的程序时,就不需要在关心具体的协议细节,直接使用socket提供的功能接口即可  

  门面设计模式,隐藏复杂的内部细节,仅提供最简单的使用接口 本质就是封装

2.TCP通讯 网络通讯一定分为两端,服务器和客户端

 服务器:

  1.创建socket对象 server = socket.socket()

  2.绑定一个固定的ip和端口 server.bind ip必须是本机ip 端口1024-65535 不要使用常见的端口 web:80 / 8080 mysql 3306 ssh:22 ftp:21

  3.开始监听客户端的到来 server.listen

  4.接收客户端的链接请求 server.accept # 阻塞直到客户链接到来 没有新连接则不可能执行该函数

  5.收发数据 需要循环 recv 收 收多少字节数 send 发 只能发二进制数据

import socket

server = socket.socket()
server.bind(("127.0.0.1",1688))
server.listen(1)
# back

while True:
    # socket,addr一个元组 客户端的ip和port
    client,addr = server.accept()
    print("接到一个客人了!开始服务!")
    # 循环收发数据
    while True:
        try:
            data = client.recv(1024).decode("utf-8")
            if not data:
                break
            print(data)
            res = data[1:]
            # client.send(res.encode("utf-8"))
        except ConnectionResetError as e:
            print("客户端了挂了!",e)
            break
    client.close()

#server.close()
客户端:
  1.创建socket对象 client = socket.socket()
  2.链接服务器   client.connect((ip,port))
  3.收发数据   通常需要循环
      send 发   只能发二进制数据
      recv 收   收多少字节数
  4.断开链接   client.close()
import socket

client = socket.socket()
try:
    client.connect(("127.0.0.1",1688))
    print("链接成功!")
    while True:
        msg = input(":")
        if msg == "q": break
        if not msg: continue
        client.send(msg.encode("utf-8"))

        data = client.recv(1024)
        print(data.decode("utf-8"))

    client.close()
except ConnectionRefusedError as e:
    print("链接服务器失败了!",e)
except ConnectionResetError as e:
    print("服务器挂了!", e)
    client.close() 

3.常见的异常

1.一方异常下线,另一方还要收发数据 :ConnectionResetError 在send recv的地方 加上try 客户端也需要异常处理

2.端口占用异常 重复运行服务器 之前的进程没有正确关闭 关闭和打开端口 都是操作系统负责 在一些极端情况下 可能应用程序已经正确接收并且通知了操作系统要关闭端口 但是操作系统 没及时处理

  2.1 更换端口

  2.2 查后台进程 杀掉它

  2.3 重启服务器电脑

 

原文地址:https://www.cnblogs.com/wyf20190411-/p/10944923.html