Python全栈学习笔记day 30:网络编程基础、基于TCP协议的socket、OSError: [WinError 10048]解决方法

一、网络编程基础

  1. C/S架构C/S即:Client与Server ,中文意思:客户端与服务器端架构
  2. B/S即:Browser与Server,中文意思:浏览器端与服务器端架构,这种架构是从用户层面来划分的。
  3. ip:规定网络地址的协议叫ip协议,定义的地址称之为ip地址,广泛采用的v4版本即ipv4,
  4. mac地址:送端和接收端的地址便是指网卡的地址,即mac地址。
  5. arp协议(地址解析协议) ——查询IP地址和MAC地址的对应关系

  6. "端口"是英文port的意译,可以认为是设备与外界通讯交流的出口。
  7. 子网掩码:判断任意两个IP地址是否处在同一个子网络

  8. TCP协议:TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信。这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。(三次握手,四次挥手)

  9. UDP协议:当应用程序希望通过UDP与一个应用程序通信时,传输数据之前源端和终端不建立连接。当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。

  10. osi七层模型

二、socket

2.1   基于TCP协议的socket

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

基础程序:

server端:

import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8898))      把地址绑定到套接字
sk.listen()                      监听链接
conn,addr = sk.accept()         接受客户端链接
ret = conn.recv(1024)           接收客户端信息
print(ret)                      打印客户端信息
conn.send(b'hi')                向客户端发送信息
conn.close()                   关闭客户端套接字
sk.close()                     关闭服务器套接字(可选)

client端:

import socket
sk = socket.socket()                创建客户套接字
sk.connect(('127.0.0.1',8898))      尝试连接服务器
sk.send(b'hello!')
ret = sk.recv(1024)          对话(发送/接收)
print(ret)
sk.close()                 关闭客户套接字

 

循环中文交流:

server端:


import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8800))
sk.listen()
conn,addr = sk.accept()
while 1:
    ret = conn.recv(1024).decode('utf-8')
    if ret == 'q':
        break
    print(ret)
    b = input('对她说的话:')
    conn.send(bytes(b,encoding='utf-8'))
conn.close()
sk.close()

client端:

import socket
sk = socket.socket()
sk.connect(('127.0.0.1',8800))
while True:
    a = input('发给他的话:')
    if a == 'q':
        break
    sk.send(bytes(a,encoding='utf-8'))
    ret = sk.recv(1024).decode('utf-8')
    print(ret)
sk.close()

 

问题:有的同学在重启服务端时可能会遇到

OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。

解决方法:

sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)        在bind前加

加入一条socket配置,重用ip和端口
import socket
from socket import SOL_SOCKET,SO_REUSEADDR
sk = socket.socket()

sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)     就是它,在bind前加

sk.bind(('127.0.0.1',8898))  #把地址绑定到套接字
sk.listen()          #监听链接
conn,addr = sk.accept() #接受客户端链接
ret = conn.recv(1024)   #接收客户端信息
print(ret)              #打印客户端信息
conn.send(b'hi')        #向客户端发送信息
conn.close()       #关闭客户端套接字
sk.close()        #关闭服务器套接字(可选)

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值