相比UDP,tcp是面向连接的,分为客户端和服务端的两种编写方式,而且相对来说更加复杂
客户端的编写
tcp_client.py
import socket
def main():
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_ip = input("请输入服务器ip:")
server_port = int(input("请输入服务器端口:"))
server_addr = (server_ip,server_port)
#对目标服务器进行连接
tcp_socket.connect(server_addr)
send_data = input("请输入要发送的数据:")
#由于已经熟知了对方的IP和端口那么
tcp_socket.send(send_data.encode("utf-8"))
tcp_socket.close()
if __name__ == "__main__":
main()
服务器的编写就要考虑很多东西了,比如需要给多个用户提供服务,需要给单个用户多次提供服务。
tcp_server.py
import socket
def main():
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_server_socket.bind(("",7788))
#需要对端口进行监听
tcp_server_socket.listen(128)
#第一层循环保证可以让多个客户端多次连接,因为没有使用多进程编写因此目前还只能一次为一个客户端服务,但是可以让多个客户端连接
while True:
#对前来访问的客户端,就会返回一个新的套接字和客户端的信息
new_client_socket,client_addr =tcp_server_socket.accept()
print(client_addr)
#第二层循环是为了保证一个客户端多次进行请求
while True:
#这里使用recv是因为已经知道对方的信息
recv_data = new_client_socket.recv(1024)
print(recv_data)
if recv_data :
new_client_socket.send("tangsai is good".encode("utf-8"))
else:
break
new_client_socket.close()
tcp_server_socket.close()
if __name__ == "__main__":
main()
本次没有使用多进程进行编写,对于异常的捕获没有使用,此外对于用户身份的校检也是没有进行的。