socket编程(TCP)
TCP协议
TCP协议介绍
- 当应用程序希望通过TCP与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方“握手”之后,TCP将在两个应用程序之间建立一个全双工(full-duplex)的通信。
- 这个全双工的通信将占用两个计算机之间的通信路线,直到它被一方或双方关闭为止。
Client与Server建立连接
- 三次握手
Client与Server数据传输
Client与Server断开连接
- 四次挥手
TCP协议特点
- 面向连接
- 可靠传输
- TCP采用发送应答机制
- 超时重传
- 错误校验
- 流量控制和阻塞管理
TCP通信
TCP客户端(client)的实现
步骤
- 1、创建套接字
tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- 2、连接服务器
ip = input('请输入ip地址:') port = eval(input('请输入端口号:')) tcp_client.connect((ip, port))
- 3、发送数据
tip: windows默认编码gbkdata = input('请输入要发送的数据:') tcp_client.send(data.encode('gbk')) # 将data转码gbk
- 4、接收数据
recv_data = tcp_client.recv(1024) print(recv_data.decode('gbk')) # 解码gbk
- 5、关闭套接字
tcp_client.close()
完整代码
import socket
def main():
# 1、创建套接字
tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2、连接服务器
ip = input('请输入ip地址:')
port = eval(input('请输入端口号:'))
tcp_client.connect((ip, port))
# 3、发送数据
data = input('请输入要发送的数据:')
tcp_client.send(data.encode('gbk')) # 将data转码gbk
# 4、接收信息
recv_data = tcp_client.recv(1024)
print(recv_data.decode('gbk')) # 解码gbk
# 5、关闭套接字
tcp_client.close()
if __name__ == '__main__':
main()
TCP服务端(server)的实现
步骤
- 1、创建套接字
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- 2、绑定ip和port
tcp_server.bind(('192.168.1.3', 8080))
- 3、使套接字变为被动连接
tcp_server.listen(2)
- 4、等待连接
print('等待连接中...') new_client, new_client_addr = tcp_server.accept() print(new_client_addr)
- 5、发送数据
data = input('请输入要发送给client的数据:') new_client.send(data.encode('gbk'))
- 6、接收数据
recv_data = new_client.recv(1024) print(recv_data.decode('gbk'))
完整代码
import socket
def main():
# 1、创建套接字
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2、绑定ip和port
tcp_server.bind(('192.168.1.3', 8080))
# 3、使套接字变为被动连接
tcp_server.listen(2)
# 4、等待连接
print('等待连接中...')
new_client, new_client_addr = tcp_server.accept()
print(new_client_addr)
# 5、发送数据
data = input('请输入要发送给client的数据:')
new_client.send(data.encode('gbk'))
# 6、接收数据
recv_data = new_client.recv(1024)
print(recv_data.decode('gbk'))
if __name__ == '__main__':
main()
优化TCP服务端
- 实现服务端为多个客户端服务
- 实现与客户端多次交流
代码示例
import socket
def main():
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server.bind(('192.168.1.3', 8080))
while True:
'''实现为多个客户端服务'''
tcp_server.listen(108)
print('等待连接中...')
new_client, new_client_addr = tcp_server.accept()
print(new_client_addr)
while True:
'''实现与客户端多次交流'''
recv_data = new_client.recv(1024)
# 当断开连接时,返回一个空字符串,聊天结束
if recv_data.decode('gbk') == '':
break
print(recv_data.decode('gbk'))
data = input('请输入要发送给client的数据:')
new_client.send(data.encode('gbk'))
# 关闭连接
new_client.close()
if __name__ == '__main__':
main()
文件下载器
- 文件传输客户端
import socket
def client():
# 1、创建套接字
tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2、连接服务器
tcp_client.connect(('192.168.1.3', 8080))
# 3、发送文件名
filename = input('请输入文件名:')
tcp_client.send(filename.encode('gbk'))
# 4、接收文件内容
file_content = tcp_client.recv(1024 * 1024)
# 5、保存新文件
with open('附件' + filename, 'ab') as f:
f.write(file_content)
# 6、关闭套接字
tcp_client.close()
if __name__ == '__main__':
client()
- 文件传输服务端
import socket
def get_content(filename):
try:
with open(filename + '.txt', 'rb') as f:
content = f.read()
except Exception as e:
print(e)
return
return content
def server():
# 1、创建套接字
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2、绑定
tcp_server.bind(('192.168.1.3', 8080))
# 3、设置队列
tcp_server.listen(1)
# 4、等待连接
new_socket, new_addr = tcp_server.accept()
# 5、接收文件名
filename = new_socket.recv(1024).decode('gbk')
# 6、发送文件内容
content = get_content(filename)
new_socket.send(content)
# 7、关闭套接字
new_socket.close()
if __name__ == '__main__':
server()
最后,有喜欢博主写的内容的伙伴可以点赞收藏加关注哦!
扫描二维码关注公众号,回复:
11403672 查看本文章