【TCP/IP网络编程实验】之【python实现客户端给服务器发送小写字母,服务器返回大写字母(TCP)】
程序员文章站
2024-03-17 18:41:22
...
1.0
Server
import socket
import time
def create_server(hostAndPort: tuple, data_size: int, data_type: str, connect_max: int):
"""
创建服务器
:param hostAndPort: 本机IP和开放端口
:param data_size: 最大传输字节
:param data_type: 编解码格式
:param connect_max: 最大连接数
:return:
"""
try:
# 创建服务器socket 对象,模式为TCP
server = socket.socket(
socket.AF_INET, socket.SOCK_STREAM # TCP
)
# 绑定主机IP与端口
server.bind(hostAndPort)
# 设置最大连接数
server.listen(connect_max)
# 退出标致
exit_flag = 0
while True:
print('等待连接。。。', end='')
# 接收套接字对象与地址
client_socket, add = server.accept()
print('\r[{}]{}连接成功!'.format(time.asctime(), add))
while not exit_flag:
# 接收内容,并解码
receiver_data = client_socket.recv(data_size).decode(data_type)
# 退出标致
if receiver_data == 'exit':
exit_flag = 1
client_socket.send('exit'.encode(data_type))
print('[{}]{}已退出'.format(time.asctime(), add))
else:
# 打印接收的内容
print('[{}]接收到来自{}的内容:{}'.format(time.asctime(), add, receiver_data))
# 将字母全部转为大写
send_data = receiver_data.upper()
# 利用客户端套接字对象发送给客户端
client_socket.send(send_data.encode(data_type))
# 打印发送的内容
print('已发送给{}内容:{}'.format(add, send_data))
except Exception as e:
raise e
if __name__ == '__main__':
create_server(('127.0.0.1', 8888), 1024, 'utf-8', 5)
client
import socket
import time
def create_client(server_host_and_port: tuple, data_size: int, data_type: str):
"""
创建客户端
:param server_host_and_port: 服务器IP及端口
:param data_size: 传输字节大小
:param data_type: 编解码类型
:return:
"""
try:
# 创建客户端socket对象,模式为TCP
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
client.connect(server_host_and_port)
# 退出标致
exit_flag = 0
while not exit_flag:
# 输入要发送的内容
send_data = input('请输入要发送的字符:')
# 编码并发送内容
client.send(send_data.encode(data_type))
# 接收内容并解码
receive_data = client.recv(data_size).decode(data_type)
if receive_data == 'exit':
exit_flag = 1
else:
# 打印服务器返回的内容
print('[{}]接收到来自服务器的消息:{}'.format(time.asctime(), receive_data))
except Exception as e:
print(e)
raise e
if __name__ == '__main__':
create_client(('127.0.0.1', 8888), 1024, 'utf-8')
运行效果截图:
2.0
解决客户端强行退出时,服务器抛出异常:
只需要修改Server:
import socket
import time
def create_server(hostAndPort: tuple, data_size: int, data_type: str, connect_max: int):
"""
创建服务器
:param hostAndPort: 本机IP和开放端口
:param data_size: 最大传输字节
:param data_type: 编解码格式
:param connect_max: 最大连接数
:return:
"""
try:
# 创建服务器socket 对象,模式为TCP
server = socket.socket(
socket.AF_INET, socket.SOCK_STREAM # TCP
)
# 绑定主机IP与端口
server.bind(hostAndPort)
# 设置最大连接数
server.listen(connect_max)
# 退出标致
exit_flag = 0
while True:
print('等待连接。。。', end='')
# 接收套接字对象与地址
client_socket, add = server.accept()
print('\r[{}]{}连接成功!'.format(time.asctime(), add))
while not exit_flag:
# 接收内容,并解码,若客户端异常退出,放弃此客户端
try:
receiver_data = client_socket.recv(data_size).decode(data_type)
except ConnectionResetError:
print('[{}]{}异常退出!'.format(time.asctime(), add))
break
# 退出标致
if receiver_data == 'exit':
exit_flag = 1
client_socket.send('exit'.encode(data_type))
print('[{}]{}已退出'.format(time.asctime(), add))
else:
# 打印接收的内容
print('[{}]接收到来自{}的内容:{}'.format(time.asctime(), add, receiver_data))
# 将字母全部转为大写
send_data = receiver_data.upper()
# 利用客户端套接字对象发送给客户端
client_socket.send(send_data.encode(data_type))
# 打印发送的内容
print('已发送给{}内容:{}'.format(add, send_data))
except Exception as e:
raise e
if __name__ == '__main__':
create_server(('127.0.0.1', 8888), 1024, 'utf-8', 5)
强行终端客户端效果:
上一篇: 线程状态
下一篇: C语言File文件操作函数学习