TCP编程步骤
TCP的socket编程的服务器端程序如下:
1、创建套接字(socket)
2、将套接字绑定到一个本地地址和端口上(bind)
3、将套接字设为监听模式,准备接收客户端请求(listen)
4、等待客户请求到来,当请求到来后,接收连接请求,返回一个新的对应于此次连接的套接字(accept)
5、用返回的套接字和客户端进行通信(send/recv)
6、返回,等待另一客户请求
7、关闭套接字
TCP的socket编程的客户端程序如下:
1、创建套接字(socket)
2、向服务器发出连接请求(connect)
3、和服务器端进行通信(send/recv)
4、关闭套接字
============================================================================
UDP编程步骤
UDP的socket编程的服务器端程序如下:
1、创建套接字(socket)
2、将套接字绑定到一个本地地址和端口上(bind)
3、等待接收数据(recvfrom)
4、关闭套接字
UDP的socket编程的客户端程序如下:
1、创建套接字(socket)
2、向服务器发送数据(sendto)
3、关闭套接字
python编程实现
TCP服务器端
# -*- coding: UTF-8 -*-
import socket
def main():
# 1、创建一个TCP服务端套接字对象
tcp_sever = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 绑定本地的相关信息,如果不绑定,则系统会随机分配一个端口号
local_addr = ('', 12344) # ip地址和端口号,ip一般不用写,表示本机的任何一个ip
tcp_sever.bind(local_addr)
# 3、监听连接,使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的链接了
tcp_sever.listen(5)
# 4、等待连接,其返回值为连接过来的客户端套接字对象和IP地址
print('waiting for connect...')
client_socket, client_addr = tcp_sever.accept()
while True:
# 5、等待接收对方发送过来的数据
recv_data = client_socket.recv(1024) # 接收TCP数据,数据以字符串形式返回;'1024'表示每次接收的最大数据量
print("Recv from", client_addr, "recv_data:", recv_data.decode("utf-8"))
command = recv_data.decode()
if command == 'exit':
break
else:
reply_info = input("server 输入回复信息:")
# 6、返回数据到客户端
client_socket.send(reply_info.encode())
# client_socket.send(b'OK!') # 如果执行的结果无返回值,则给客户端发送'OK'
# 7、关闭套接字
tcp_sever.close()
if __name__ == '__main__':
main()
TCP客户端实现
# -*- coding: UTF-8 -*-
import socket
def main():
# 1、创建一个TCP服务端套接字对象
tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 准备服务端的地址和端口,'192.168.2.11'表示目的ip地址,12344表示目的端口号
dest_addr = ('192.168.2.11', 12344) # 注意这是一个元组,其中ip地址是字符串,端口号是数字
# 3、链接到服务器
tcp_client.connect(dest_addr)
while True:
com = input("client 输入命令:")
# 4、发送数据
if com == 'exit':
tcp_client.send(b'exit') # 发送TCP数据,将输入的命令发送到连接的套接字。
break
else:
tcp_client.send(com.encode())
# 5、等待接收服务端发送过来的数据,最大接收1024个字节
d = tcp_client.recv(1024) # 接收TCP数据,数据以字符串形式返回;'1024'为指定要接收的最大数据量。
# 6、将接收到的数据打印出来
print('client recv: ', d.decode(), '--->', len(d)) # 打印从服务端发送回来的数据和长度
# 7、关闭套接字
tcp_client.close()
if __name__ == '__main__':
main()
UDP编程实现
UDP不像TCP需要建立永久联系并进行监听,因此客户端和服务端的实现基本都是一样的。其中,服务端需要绑定固定的端口,方便客户端进行连接发送信息。而绑定端口对于客户端是一个可选项, 可以根据自己的需要进行设置。
import socket
# 创建一个服务器的套接字基于udp,type=socket.SOCK_DGRAM表示使用udp协议
udp_sk = socket.socket(type=socket.SOCK_DGRAM)
udp_sk.bind(('192.168.30.227', 8080)) # 绑定服务器的ip和端口的套接字
while True:
# udp协议不用建立连接
msg, addr = udp_sk.recvfrom(1024) # 接收1024字节的消息 msg表示内容,addr表示ip和端口
print(msg)
inp = input('>>>').strip().encode('utf-8')
udp_sk.sendto(inp, addr) # 发送消息,需写入对方的ip和端口
udp_sk.close()
参考文献
Python网络编程之udp
python——udp网络通信
https://blog.csdn.net/qq_15029743/article/details/82429828