文章目录

  • 1、windows 系统下如何查看当前的ip地址
  • 2、qq消息为啥不会传到微信里面?端口号问题
  • 3、 什么是端口(重点呐)
  • 4、创建socket(python版)
  • 5、发送与接受数据
  • 6、公有ip和私有ip
  • 7、单工、半双工、全双工
  • 8、TCP客户端和服务器的建立
  • TCP客户端(需要先运行服务器,才可以运行客户端,此外需要修改自己为自己的电脑ip)
  • TCP服务器

1、windows 系统下如何查看当前的ip地址

打开终端(win+r)输入下面命令行

#写在前面:该页面ctrl+F可以查询内容,便于定位到你所需要知道的知识。
ipconfig

在公司时候输入ipconfig (在公司网络下你的电脑ip是固定的,每天你ipconfig一下都不会变)

python tcp客户端重连 python socket断线重连_客户端


个人的热点链接电脑,输入ipconfig

python tcp客户端重连 python socket断线重连_网络协议_02

各部分的解释:

本地链接的IPv6:当前电脑的ip或者手机的热点ip
IPv4地址:当前电脑的ip或者手机的热点ip
子网掩码:
默认网关:网关又称网关路由器。比如我们要发送消息给翠花,消息会先经过自己家的路由器A,再由自己家的路由器A将消息发给翠花家路由器B,最后翠花家路由器B把消息传送给翠花。网关的作用类似一个通关口

2、qq消息为啥不会传到微信里面?端口号问题

电脑有自己的ip,电脑上的软件有特定的端口号,qq有qq端口号,微信有微信端口号。所以传递的消息上也是有软件端口号信息的。下面两张图片引用了b站的python-socket教程。https://www.bilibili.com/video/BV1Xx411R743/?p=5&spm_id_from=pageDriver&vd_source=f99e21db912f182fe051b1b6b156e0e3

左边机器向右边机器发送消息

python tcp客户端重连 python socket断线重连_网络协议_03


右边机器向左边回复消息

python tcp客户端重连 python socket断线重连_python tcp客户端重连_04

3、 什么是端口(重点呐)

一个程序没有运行之前称为:程序。
一个程序运行起来之后称为:进程,并用端口号标记该程序

端口号0-1023用于特定用途(类似于手机号码很多,但是110,120,119用于特定用途的),1024-65535端口号为动态端口,我们可以自由使用。

4、创建socket(python版)

Socket函数使用的格式为:socket(family,type[,protocol])

参数

功能

family

socket.AF_INET 表示服务器之间网络通信

type

socket.SOCK_STREAM,当使用TCP时选择此参数

type

socket.SOCK_DGRAM ,当使用UDP时选择此参数

import socket

# 创建tcp的套接字  
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 不用时关闭
s.close()

# 创建udp的套接字
s1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 不用时关闭
s1.close()

5、发送与接受数据

注意:
1、如果未能绑定端口则操作系统会随机分配一个端口。如果应用需要接收并发送消息则需要给程序绑定特定的端口。
2、同一个电脑的两个应用程序不可以绑定同一个端口号。
3、windows通讯用gbk编码,与mac和liux通讯用utf-8编码

'''发送数据'''

import socket


def main():
    # 1、创建套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 2、绑定一个本地信息
    localaddr = ("", 7790)
    udp_socket.bind(localaddr)  # 必须绑定自己电脑的ip以及port,其他的不行
    # 3、接收数据 recv_data存储一个元组(接收到的数据,(发送方的ip和port端口号))
    while True:
        # 1、从键盘中获取数据
        send_data = input("请输入要发送的数据:")
        udp_socket.sendto(send_data.encode("gbk"), ("192.168.40.137", 7788))
    # 5、关闭套接字
    udp_socket.close()


if __name__ == "__main__":
    main()

程序运行并输入111回车

python tcp客户端重连 python socket断线重连_python_05

'''接受数据'''

import socket


def main():
    # 1、创建套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 2、绑定一个本地信息
    localaddr = ("", 7788)
    udp_socket.bind(localaddr)  # 必须绑定自己电脑的ip以及port,其他的不行
    # 3、接收数据 recv_data存储一个元组(接收到的数据,(发送方的ip和port端口号))
    while True:
        recv_data = udp_socket.recvfrom(1024)
        recv_mes = recv_data[0]  # 存储接收的数据
        send_addr = recv_data[1]  # 存储方的地址信息
        # 4、打印接收到的数据
        # print("%s:%s" % (str(send_addr), recv_mes.decode("utf-8")))
        # 接收来自windows的编码内容:windows默认采用gbk编码,因此需要用gbk解码,
        print("%s:%s" % (str(send_addr), recv_mes.decode("gbk")))
    # 5、关闭套接字
    udp_socket.close()


if __name__ == "__main__":
    main()

接收端会收到信息111并且显示电脑ip和端口号。

python tcp客户端重连 python socket断线重连_websocket_06

6、公有ip和私有ip

为什么你在学校实验或者在项目现场看到的IP都是192.168.1.1-192.168.255.255这个范围内部呢。因为这个ip区间是私有ip,是不直接上互联网的,无法和世界互联。只有和世界互联的ip才是唯一的独有的ip。

7、单工、半双工、全双工

单工:只可以发送或者接收消息,比如收音机
半双工:可以接收也可以发送消息,但是同一时刻只能接收或发送。
全双工:同一时刻既可以发消息也可以接收消息。socket套接字是全双工的。

8、TCP客户端和服务器的建立

tcp通讯包括三个部分:建立链接、发送消息、终止链接。
(比如在打电话时候,拨打出去并不会立马接通,因为需要先建立链接,所以tcp通讯传输数据更加稳定,不容易丢包。)
可靠传输:tcp采用发送应答机制、超时重传、错误校验、流量控制和阻塞管理

一个tcp的套接字可以转化为一个监听套接字,专门用于监听客户端的接入。

python tcp客户端重连 python socket断线重连_网络协议_07

TCP客户端(需要先运行服务器,才可以运行客户端,此外需要修改自己为自己的电脑ip)

'''TCP客户端 '''
import socket


def main():

    # 1.创建tcp的套接字
    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.链接服务器
    tcp_socket.connect(("192.168.40.137", 7890))
    # 3.发送数据、接收数据
    while True:
        send_data = input("请输入要发送的数据:")
        tcp_socket.send(send_data.encode("gbk"))
        # 4.关闭套接字
    tcp_socket.close()


if __name__=="__main__":
    main()

TCP服务器

'''TCP服务器'''

import socket


def main():
    # 1.买个手机(创建套接字 socket)
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.传入手机卡(绑定本地信息 bind)
    tcp_server_socket.bind(("", 7890))
    # 3.将手机设置为正常的 响铃模式(让默认的套接字由主动变为被动listen)
    tcp_server_socket.listen(128)

    print("等待一个新的客户端到来。。。。")
    # 4.等待别人的电话到来(等待客户端的链接 accpet)
    # new_client_socket 负责和客户端通讯
    new_client_socket, clientAddr = tcp_server_socket.accept()  # 卡住 等待客户端连接。
    print("一个新的客户端已经到来%s"% str(clientAddr))
    # 接收客户端发送过来的请求
    while True:
        recv_data = new_client_socket.recv(1024)  # 卡住等待客户端输入。实时通讯依赖于recv_data。recv_data相当于信鸽
        print("客户端发送过来的请求是:%s" % recv_data.decode("gbk"))

        print("客户端连接断开")
        if recv_data:
            new_client_socket.send("shoudao".encode("gbk"))
        else:
            new_client_socket.close()


if __name__ == "__main__":
    main()