一句废话:最近学习python核心编程,遇到了运行简单的(有多简单自己看)tcp服务器与客户端黑屏闪退的问题
原因:
>>>from socket import *
>>> help(socket.recv)
Help on method_descriptor:
recv(...)
recv(buffersize[, flags]) -> data
Receive up to buffersize bytes from the socket.
>>> help(socket.send)
Help on method_descriptor:
send(...)
send(data[, flags]) -> count
Send a data string to the socket.
因为工作模式为:客户端发送-服务器接收-服务器发送-客户端接收
即客户端发送的数据类型必须符合服务器接收的数据类型,即字节流,表现为
客户端:发送,data.encode(),因为要给服务器接收用
服务器:接收,data.decode(),因为要给服务器send用
服务器:发送,data.encode(),因为要给客户端接收用
客户端:接收,data.decode,因为要显示输出
详细代码如下:
服务器:
from socket import *
from time import ctime
Host=‘‘
Port=3306
BufSIZE=1024
Addr=(Host,Port)
Sst=socket(AF_INET,SOCK_STREAM)
Sst.bind(Addr)
Sst.listen(5)
while True:
print(‘....Wait Connect....‘)
Cst,Addr=Sst.accept()
print(‘....Connect From ‘,Addr,‘....‘)
while True:
data=Cst.recv(BufSIZE).decode()
Cst.send(data.encode())
Cst.close()
Sst.close()
客户端:
from socket import *
Host=‘localhost‘
Port=3306
BuffSIZE=1024
Addr=(Host,Port)
Cst=socket()
Cst.connect(Addr)
while True:
data=input(‘>‘).encode()
Cst.send(data)
data=Cst.recv(BuffSIZE).decode()
print(‘>:‘,data)
不足之处,敬请谅解,同时请帮忙指正,不胜感激。
附有如下问题:
1.socket.send()要求是字符串的参数,data.encode()为什么不报错,编码之后指定不是字符串了呀?
2.tcp服务器是个死循环,但是当关闭客户端的时候,它报个异常就退出了,怎么改变?
3.客户端也是个死循环,当服务器关闭的时候他不知道,运行时不报错,怎么让客户端知道,服务器关闭了呢?
本文出自 “Python” 博客,请务必保留此出处http://52syc.blog.51cto.com/10591392/1775643
原文地址:http://52syc.blog.51cto.com/10591392/1775643