accept :连接一个客户端:连接对象, 地址

这个连接断开之前,别的连接是不受理的。如果客户端断开,会报错,因为连接突然没了。

所以,客户端会使用随机端口,但是端口会用完。因为端口不会立即释放。跟系统设置有关,一般的业务应该没有问题,自动释放,是可以接受的。

不对的 !!!:一个端口只用一次。

不对的 !!!:所以,用 bind 固定客户端端口。服务端异常处理。每个服务分配一个端口,软件运行中不关闭连接。

服务端应该使用 内置模块 serversocket,并发服务器。

socket 客户端不允许发送 空字符串,会夯住

socket 服务端,当接受字符串为:0,客户端断开了连接

socket server

import socket
import socketserver

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('127.0.0.1',5555))
s.listen(5)
cs,address=s.accept() #让服务器可以在close之后接收其他客户端的连接请求
while True:
    data = cs.recv(1024)
    cs.send(b'OK hello world!')
s.close()

socket client

'''socket测试客户端'''
import socket

plc_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
plc_socket.bind(('127.0.0.1',5001))
plc_socket.connect((plc_ip, plc_port))
while 1:
    try:
        plc_socket.send(send_data.encode('utf-8'))
        recv_data = plc_socket.recv(1024)
    except OSError:
        logging.exception('oserror')
        plc_socket.close()



socketserver

'''socket测试服务端'''
import socketserver

class SockeListenServer(socketserver.BaseRequestHandler):
    def handle(self):
        while True:
            try:
                data = self.request.recv(1024)
                self.request.send(b'OK zzz\r\n')
                print("客户端%s发来的消息:%s"%(self.client_address,data.decode('utf-8')))
            except Exception as e:
                print(e)
                break
        self.request.close()
            # 关闭服务(可选操作)
        self.server.shutdown()
            # phone.close()

server = socketserver.ThreadingTCPServer(('127.0.0.1',8501),SockeListenServer)
server.serve_forever()