服务器端的代码非常简单,收到客户端连接建立后发送一个简单的http 报文
# 导入 socket、sys 模块 import socket import sys # 创建 socket 对象 serversocket = socket.socket( socket.AF_INET, socket.SOCK_STREAM) port = 80 serversocket.bind(('127.0.0.1', port)) # 设置最大连接数,超过后排队 serversocket.listen(5) while True: # 建立客户端连接 clientsocket,addr = serversocket.accept() print("连接地址: %s" % str(addr)) #str = clientsocket.recv(1024)
#print(str) #msg='欢迎访问菜鸟教程!'+ "\r\n" msg = 'HTTP/1.1 200 OK\r\nContent-Type: text/html;charset=ISO-8859-1\r\nContent-Length: 500\r\n\r\n<html>\r\n<head>\r\n<title> hello word it is my first try</title>\r\n</head>\r\n<body>\r\n<h2>\r\n hello word it is my first try</h2>\r\n</body>\r\n</html>\r\n' clientsocket.send(msg.encode('utf-8')) #clientsocket.close()
客户端连接建立后连发三条消息,然后收消息.
#!/usr/bin/python3 # 文件名:client.py # 导入 socket、sys 模块 import socket import sys # 创建 socket 对象 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设置端口好 port = 80 # 连接服务,指定主机和端口 s.connect(('127.0.0.1', port)) sr = "this is the message from client" s.send(sr.encode('utf-8')) sr = "this is the message from client" s.send(sr.encode('utf-8')) sr = "this is the message from client" s.send(sr.encode('utf-8')) for index in range(1,10000): pass msg = s.recv(1024) print (msg.decode('utf-8')) while True: pass
先运行server,再运行client.client会收到server的http报文。
client中for循环是为了延时,以免收的时候server还没发(两边是异步的)。
去掉server中 收数据的注释,则server会收到client 发送的 消息,不过收到内容是不确定的,
recv会将当前信道上所有的数据收过来,而此时信道上client发送了几个消息是不确定的(server执行到这里的时候client发送了几次是不确定的)当在client发送第一条消息后加一个很大的延时,显示server收到一个消息,而不加的话一般收到三个。
recv 函数是阻塞的,信道上没有数据时会等待。
tcp 同时维持了两个信道 ,收信道和发信道。因此是全双工的通信,两边发送时不受影响,想发送时将数据扔到信道里去就行,另一端读数据是从信道里按字节数量往外读,其实发几条是语句呈现的假象,另一端实际上并不能知道消息的分界(没有特殊约定的话),只是从信道按字节数量读出了数据。
what messed me up is :
当我运行server以后,当我在dege浏览器中输入127。0。0。1
server建立连接后必须收一次数据,才能将http报文发出去。如果是tcp的话按理来说是不用的。
在chrom中就不用收那一次数据,而必须胡close 之前加个延时,这样chrome才能收到http报文。