创建socketserver的步骤
1.你必须自己创建一个请求处理类,并且这个类要继承BaseRequestHandler,并且还有重写父类里的handle()
2.你必须实例化TCPServer, 并且传递server ip和你上面创建的请求处理类给这个TCPServer
3.
server.handle_request() # 只处理一个请求
server.serve_forever() # 处理多个请求,永远执行
4.调用server_close() 关闭socket
socketserver端
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
"""
The request handler class for our server.
It is instantiated once per connection to the server, and must
override the handle() method to implement communication to the
client.
"""
def handle(self): # 跟客户端所有的交互都是在handle里写的
# self.request is the TCP socket connected to the client
while True: # 有异常就抓出来 继续循环
try:
self.data = self.request.recv(1024).strip() # self.request同conn一样,就是客户端连过来而在服务端为其生成的一个连接实例
print("{} wrote:".format(self.client_address[0])) #self.client_address同addr一样,是客户端连接ip 和端口
print(self.data.decode())
# just send back the same data, but upper-cased
self.request.send(self.data.upper())
except ConnectionResetError as e:
print("error:", e)
break
if __name__ == "__main__": # if这个语句代码只在本脚本执行,作为模块在其他脚本不执行这条if代码里的语句
HOST, PORT = "localhost", 6969
print(__name__)
# Create the server, binding to localhost on port 9999
# server = socketserver.TCPServer((HOST, PORT), MyTCPHandler) #一个实例化的TCPServer 只支持单线程 , server实例是BaseRequestHandlerde的self.server
server = socketserver.ThreadingTCPServer((HOST, PORT),MyTCPHandler) # 一个实例化的ThreadingTCPServer 支持多线程 Threading开启新线程
# server = socketserver.ForkingTCPServer((HOST,PORT),MyTCPHandler) #一个实例化的ForkingTCPServer 支持多进程 Forking开启多进程 只在Linux有效
# Activate the server; this will keep running until you
# interrupt the program with Ctrl-C
server.serve_forever() # 处理多个请求,永远执行
server.allow_reuse_address() # 允许地址重用
# __name__ 意思是文件名 被导入到其他脚本中就是本脚名(模块名) __main__代表本脚本,代表自己
# __name__在自己脚本里是__main__, import 到其他脚本就是本脚本的文件名
例如:name1.py
print("I m the first")
print(__name__)
if __name__ == "__main__":
print("I m the second")
tes.py
import name1
一个python的文件有两种使用的方法:
作用一,直接作为脚本执行。
作用二,import到其他的python脚本中被调用(模块重用)执行。
if __name__ == '__main__': 的作用就是控制这两种情况执行代码的过程,在if
__name__ == '__main__': 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而import到其他脚本中是不会被执行的。
运行原理
每个python模块(python文件)都包含内置的变量__name__,当运行模块被执行的时候,__name__等于文件名(包含了后缀.py)。如果import到其他模块中,则__name__等于模块名称(不包含后缀.py)。而"__main__"等于当前执行文件的名称(包含了后缀.py)。所以当模块被直接执行时,__name__ == '__main__'
结果为真;而当模块被import到其他模块中时,__name__ == '__main__'
结果为假,就是不调用对应的方法。
简而言之就是:__name__
是当前模块名,当模块被直接运行时模块名为
__main__ 。当模块被直接运行时,代码将被运行,当模块是被导入时,代码不被运行。
原文:https: // blog.csdn.net / youzhouliu / article / details / 53884496
client端
import socket
client = socket.socket() # 默认famliy=AF_INET(ipv4)地址簇 type=SOCK_STREAM (tcp/ip) 声明socket类型,同时生成socket连接对象
client.connect(("localhost", 6969))
while True:
msg = input("请输入:").strip() # 不能发送空数据
if len(msg) == 0: continue # 如果msg长度为0,就继续 返回到下一次msg=raw_input("请输入:").strip()
client.send(msg.encode("utf-8")) # 3.x 只能发bytes类型数据,只能接收ASCII数据,汉字不行,要发汉字只能编码成utf-8格式
data = client.recv(1024) # 收1024字节数据
print("recv:", data.decode("utf-8")) # bytes类型打印出来要解码
client.close()