博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python实现TCP客户端与服务器(代码以及代码分析)
阅读量:3949 次
发布时间:2019-05-24

本文共 3076 字,大约阅读时间需要 10 分钟。

目录

使用python Socket套接字来实现TCP客户端,TCP服务端。

在调试时注意:

1.代码复制过后可能缩进格式被改变,可能需要自己调整缩进格式。
2.在调试时,尽量使用网络调试助手进行调试,由于客户端和服务器代码只发或收一次就退出,可能导致没出现预定结果。

1 TCP

TCP的连接分为服务端和客户端。在python中无论是服务端还是客户端,首先需要做的就是导入socket包

import socket

其次所需要的就是实例化一个TCP的对象

需要注意的是,服务端和客户端这两步相同。

socket.socket(socket.AF_INET,socket.SOCK_STREAM)

1.1 TCP服务端

1.1.1 bind()绑定IP,端口号

如果是TCP服务端,就要自己固定一个IP和端口号以供其他客户端连接。所以需要绑定IP和端口号需要用到bind()函数。值得注意的是在函数中的参数应为元组形式的IP和端口号,IP为字符串,端口号为整形。

Tcp_Server_Socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)Tcp_Server_Socket.bind(("127.0.0.1",9090))

1.1.2 listen()设置监听

在服务端绑定过后就需要使用 listen() 设置监听。这里说设置监听,在我的理解就是设置监听队列并监听之前绑定的端口,如果有客户端连接 9090 端口时,自动将其加入到 listen 所创建的队列中

(由于TCP的三次握手机制队列中既存在已经完成三次握手的客户端,也存在只完成一次或两次握手的客户端,他们共同占用该队列,所以如果未完成三次握手的客户端迟迟不完成,同时有多个客户端也只进行一次或二次连接,会导致队列被占满,同时由于没有已完成三次握手的客户端,从而导致不能从中提取可以使用的客户端而不能提供服务)
既然存在等待队列,那么一定可以设置队列大小,其大小需要在 listen()的参数中填写

Tcp_Server_Socket.listen(128)

1.1.3 accept()提取可用客户端

在队列设置好后如果有已完成三次握手的客户端,TCP服务器就应该可以跟它收发信息。

于是 accept() 可以在队列中提取完成连接的客户端(三次握手)
accept()在使用时,如果队列中无完成连接的客户端accept()将阻塞,直到提取出完成连接的客户端并返回一个新的socket对象。通过新的socket可以实现与客户端的信息交互。
值得注意的是:accept()的返回值是一个元组,(新的socket对象,客户端地址),所以在接收时就需要用元组的形式接收。

Client_Socket,Client_Addr = tcp_server_socket.accept()

1.1.4 recv()接收和send()发送

在获取了新的socket后,通过这个socket就可以与客户端实现信息交互,所使用的函数为recv()和send()

接收:

Recv_Data = Client_Socket.recv(512)

发送:

发送这里需要注意:如果发送中文一定明确客户端的编码格式,否则中文无法正确显示,windows使用gbk,linux为utf-8。
encode()为是以所选格式编码。

Client_Socket.send("hello world".encode("gbk"))

1.1.5 close()关闭

在使用过后需要记得关闭socket。

Client_Socket.close()

1.1.6 TCP服务器完整代码

import socketdef main():    Tcp_Server_Socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)    tcp_server = ("127.0.0.1",9090)    Tcp_Server_Socket.bind(tcp_server)    Tcp_Server_Socket.listen(128)    Client_Socket,Client_Addr = Tcp_Server_Socket.accept()    Recv_Data = Client_Socket.recv(1024)    print(Recv_Data)    Client_Socket.send("hello world".encode("gbk"))    Client_Socket.close()    Tcp_Server_Socket.close() if __name__ == "__man__":   main()

1.2 TCP客户端

TCP客户端与TCP服务器端相比少了许多步骤。

1.2.1 bind()绑定(可省略)

由于客户端需要连接固定IP和端口号的服务端,如果不固定自身IP和端口号,在程序运行时,系统自动分配IP与端口号。所以并不一定需要绑定IP和端口号。但我使用的是 127.0.0.1 回环地址,所以还是需要绑定下,以防不必要的麻烦。

Tcp_Client_Socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)Tcp_Client_Socket.bind("127.0.0.1",8080)

1.2.2 connect()连接

既然是客户端,一定需要连接服务端。使用connect()来连接服务端。

值得注意的是:connect()的参数也是一个元组,例如:(“127.0.0.1”,9090)

Tcp_Client_Socket.connect("127.0.0.1",9090)

1.2.3 recv() 接收 send() 发送

recv() 和 send() 的使用还是一样,send()发送的时候需要指定编码格式,

例如:(“hello world”.encode(“gbk”))
发送:

Tcp_Client_Socket.send(Send_Data.encode("gbk"))

接收:

Recv_Data = cp_Client_Socket.recv(512)print(Recv_Data)

1.2.4 close()

在使用过后使用close()关闭

Tcp_Client_Socket.close()

1.2.5 TCP服务端完整代码

import socketdef main():    Tcp_Client_Socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)    Tcp_Client_Socket.bind("127.0.0.1",8080)	Tcp_Server = ("127.0.0.1",9090)    Tcp_Client_Socket.connect(Tcp_Server)    Send_Data = input("请输入要发送的消息")    Tcp_Client_Socket.send(Send_Data.encode("gbk"))    Tcp_Client_Socket.close()if __name__ == "__main__":   main()

转载地址:http://buewi.baihongyu.com/

你可能感兴趣的文章
postman使用
查看>>
ClassNotFoundException和NoClassDefFoundError的区别
查看>>
Tomcat Connector三种运行模式(BIO, NIO, APR)的比较和优化
查看>>
Maven 使用Assembly 配置详细解释
查看>>
调试打包jar方法
查看>>
MVC RPC SOA 和微服务架构的区别
查看>>
HTTP与TCP的区别和联系
查看>>
解决Cannot resolve method 'onMethod_'
查看>>
VMware 虚拟机NAT模式如何设置网络连接
查看>>
cloud2020
查看>>
@bean和@component的理解
查看>>
spring注解@Primary与@Qualifier
查看>>
annotation之@Autowired、@Inject、@Resource三者区别
查看>>
idea启动微服务找不到配置文件
查看>>
Java通过反射机制调用某个类的方法
查看>>
字节跳到面试题
查看>>
Linux查看物理CPU个数
查看>>
Linux学习之网络IO,磁盘io
查看>>
ES7.6.2安装
查看>>
查看jar依赖树
查看>>