TCP服务端(服务器)
如果想执行tcp服务器的功能,需要执行以下流程
- socket创建一个套接字
- bind方法绑定IP和port
- listen使套接字变为可被动链接
- accept等待可无端的链接(必须创建一个新的监听套接字和重定义一个新的接收器)
- recv/send接收发送数据
对于accept必须要接收两个 一个是定义新的套接字,另一个是监听的函数。对其进行监听
import socket
def main():
#1.买个手机(创建套接字 socket)
#这个套接字用来初始化响应,最终需要最后新定义的套接字进行真正的实现通信
tcp_server_scoket =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#2.插入手机卡(绑定本地信息 bind)
tcp_server_scoket.bind(("",7890))
#3.将手机设为正常的响铃模式(让默认的套接字有主动变为被动 listen)
tcp_server_scoket.listen(128)
print("------1----------")
#4.等待别人电话到来(等待客户端的链接 accpet)
#重定义新的套接字和新的绑定IP和端口
new_client_socket,client_addr =tcp_server_scoket.accept()
print("--------2--------")
print(client_addr)
#接收客户端发过来的请求
recv_data =new_client_socket.recv(1024)
print(recv_data)
#会送一部分数据给客户端
new_client_socket.send("hhhhhhh".encode("utf-8"))
new_client_socket.close()
tcp_server_scoket.close()
if __name__ == '__main__':
main()
总结,前文与udp接收消息还是有很大区别的,比如,TCP信号传递需要用到新的套接字,后面要重新定义一下。端口绑定和udp相同,在前面一定要做的。通过新的套接字和监听的IP及端口调用的accept函数在服务端没有接收到客户端的信息发送的时候会出现拥堵的情况,没有接收到客户端传来的信息这样会导致程序无法继续向前执行,一旦有人发送信息被客户端接收了,那么客户端就继续执行结束,这样就导致程序直接接收到一个用户的信息,而且只能接收一次,这样就会存在这弊端,为了解决这个弊端我们要重新优化一下代码。使tcp服务端循环为多名客户服务
TCP服务端循环为多个客户端服务
import socket
def main():
#1.买个手机(创建套接字 socket)
#这个套接字用来初始化响应,最终需要最后新定义的套接字进行真正的实现通信
tcp_server_scoket =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#2.插入手机卡(绑定本地信息 bind)
tcp_server_scoket.bind(("",7890))
#3.将手机设为正常的响铃模式(让默认的套接字有主动变为被动 listen)
tcp_server_scoket.listen(128)
#这个while True:循环为多个客户端服务
while True:
print("等待一个新的客户端的到来....")
#4.等待别人电话到来(等待客户端的链接 accpet)
new_client_socket,client_addr =tcp_server_scoket.accept()
print("一个客户端已经到来")
print("一个新的客户端已经到来%s"%str(client_addr))
#接收客户端发过来的请求
#这个 while True循环多次为同一个客户端服务多次
while True:
recv_data =new_client_socket.recv(1024)
print("客户端发送过来的请求是%s"%recv_data.decode("utf-8"))
#会送一部分数据给客户端
new_client_socket.send("hhhhhhh".encode("utf-8"))
new_client_socket.close()
print("服务完成")
#如果将监听套接字关闭,那么就导致无法等待新的客户端到来 即 xxxx.accept就会失败
tcp_server_scoket.close()
if __name__ == '__main__':
main()
继续优化,再来一口美味的汤
import socket
def main():
#1.买个手机(创建套接字 socket)
#这个套接字用来初始化响应,最终需要最后新定义的套接字进行真正的实现通信
tcp_server_scoket =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#2.插入手机卡(绑定本地信息 bind)
tcp_server_scoket.bind(("",7890))
#3.将手机设为正常的响铃模式(让默认的套接字有主动变为被动 listen)
tcp_server_scoket.listen(128)
#这个while True:循环为多个客户端服务
while True:
print("等待一个新的客户端的到来....")
#4.等待别人电话到来(等待客户端的链接 accpet)
new_client_socket,client_addr =tcp_server_scoket.accept()
print("一个客户端已经到来")
print("一个新的客户端已经到来%s"%str(client_addr))
#接收客户端发过来的请求
#这个 while True循环多次为同一个客户端服务多次
while True:
recv_data =new_client_socket.recv(1024)
print("客户端发送过来的请求是%s"%recv_data.decode("utf-8"))
#会送一部分数据给客户端
#如果recv解堵塞,那么有两种方式
#1.客户端发送过来数据 2. 客户端调用close导致这里recv解堵塞
if recv_data:
#会送一部分数据给客户端
new_client_socket.send("hhhhhhh".encode("utf-8"))
else:
break
new_client_socket.close()
print("服务完成")
#如果将监听套接字关闭,那么就导致无法等待新的客户端到来 即 xxxx.accept就会失败
tcp_server_scoket.close()
if __name__ == '__main__':
main()
总体来说,与udp相似,需要注意几个点,TCP服务是需要两个端联动的,一个是客户端,一个是服务端。