python socket通信的小例子和几点反思

16 篇文章 0 订阅

服务器端的代码非常简单,收到客户端连接建立后发送一个简单的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报文。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值