python网络编程之TCP聊天室

使用ipv4和tcp协议进行单线程通信:

socket的工作流程:
服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。

客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。

客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

tcp和udp的区别:
tcp是面向连接的,可靠的(网络传输中丢失的数据包会被检测到并重新发送),有序的(数据按发送者写入的顺序被读取)。
udp是面向无连接的,不可靠,无序的。

一、客户端代码:

import socket

def main():
	
	#1.创建TCP套接字
	tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
	
	#2.获取服务器的ip/port
	server_ip = input("请输入服务器端的ip:")
	server_port =int(input("请输入服务器的端口号:"))
	server_address = (server_ip,server_port)

	#3.连接到服务器
	tcp_socket.connect(server_address)

	#4.获取下载文件的名称
	down_file = input("请输入想要下载的文件名:")

	#5.将文件名发送给服务器
	tcp_socket.send(down_file.encode("utf-8"))
	
	#6.接收文件中的数据
	recv_data = tcp_socket.recv(1024)   #1024:文件大小

	#7.保存接收到的数据到文件中
	if recv_data:	#recv_data中没有数据时,if 0:不执行if下的代码块
		with open("[附件]"+down_file,"wb") as f:
			f.write(recv_data)

	#8.关闭套接字
	tcp_socket.close()

if __name__ == "__main__":

	main()

二、服务器代码:

import socket

def bind_listen(tcp_socket):

	# 绑定信息(bind)
	tcp_socket.bind(("", 7896))

	# 监听(listen)
	tcp_socket.listen(128)  # 128:同时在线人数


def send_file(new_client,other_client):
	"""给客户端发送文件及判断"""

	#接收客户端下载文件的请求
	file_name = new_client.recv(1024).decode("utf-8")
	print("客户端[%s]需要下载的文件是:%s"%(str(other_client),file_name))

	#打开文件并且读取数据
	#假设文件为空
	file_content = None

	try:
		f = open(file_name,"rb")	#rb:以只读方式打开二进制文件	
		file_content = f.read()
		f.close()
	except Exception as ret:
		print("没有要打开的文件:%s"%file_name)
	
	if file_content:
		
		#发送文件的数据给客户端呢
		new_client.send(file_content)
   
def main():

	#创建套接字(socket)
	tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

	bind_listen(tcp_socket)

	while True:
		
		#等待
		new_client,other_client = tcp_socket.accept()

		#调用发送文件的函数,给客户端服务
		send_file(new_client,other_client)

		#关闭客户端套接字
		new_client.close()

	#关闭服务器套接字
	other_client.close()


if __name__ == "__main__":

	main()

你可能感兴趣的:(python)