Python网络编程基础笔记-以NULL作为字符串结束标识

1.服务器端程序接收数据
               
               
                # -*- coding: cp936 -*-
"""
接收以NULL("\0")作为结束标识的字符串
为了演示多次接收数据,故意将接收的缓冲区改小为20.
客户端发送的数据长度(以"\0"作为判断长度的表示,而不是NULL)应该大于20
"""
import socket
import sys
host = ""
port = 50000
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((host,port))
s.listen(5)
while 1:
    clientsock,clientaddr = s.accept()
    while 1:
        buf = clientsock.recv(20)
        # 判断发送的最好一个字符是否是'\0'
        if len(buf) != 0:
            # 这次使用了sys.stdout.write,它不会自动添加"\n",所有的"\n"都是从客户端接收来的.
            sys.stdout.write(buf)
            if buf[len(buf)-1] == '\0':
                break
    clientsock.close()
   
"""
输出结果:
0000
1111
2222
3333
4444
5555
6666
7777
8888
9999
每次recv服务器端会接收20个字符,如果接收到"\0"就表明客户端发送的字符串结束了,
可以关闭socket了,注意中间出现的"\n"直接打印成换行符
"""
2.客户端发送字符串程序
# -*- coding: cp936 -*-
"""
发送以Null("\0")作为结束标识的字符串
发送的字符串长度应该大于服务器接收缓冲区的长度(20),否则无法在服务器端演示多次调用recv
注意字符串中添加了不少的"\n"
"""
import socket
host = "localhost"
port = 50000
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((host,port))
s.send("0000\n1111\n2222\n3333\n4444\n5555\n6666\n7777\n8888\n9999" + "\0")
s.close()