import socket
#创建服务器套接字对象
tcp_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定ip地址和端口号
tcp_server.bind(('与服务器绑定的ip',与服务器绑定的端口))
#开启监听
tcp_server.listen(128)
#等待接受客户端的连接请求
conn_socket,ip_port=tcp_server.accept()
#接收数据
recv_data=conn_socket.recv(1024)
print(recv_data.decode('utf-8'))
#发送数据
conn_socket.send('wobuhao'.encode(encoding='utf-8'))
#关闭套接字
conn_socket.close()
tcp_server.close()
TCP服务器面向对象版本
步骤:
1.创建一个webserver服务器
2.初始化方法 init
3.定义方法
4.实例化对象
5.调用方法
import socket
#创建一个webserver服务器
class Webserver(object):
#初始化方法__init__()魔术方法,用于对象初始化,将最常用的放到里面
def __init__(self):
#创建套接字对象
self.tcp_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#设置监听与绑定端口号
self.tcp_server.bind(('',9000)) #''默认ipv4端口
self.tcp_server.listen(128)
# 定义一个方法,用于接受和发送消息
def handle_client_request(self,conn_socket,ip_port):
#接受客户端消息
recv_data=conn_socket.recv(1024)
recv_data=recv_data.decode('utf-8')
print(f'端口{ip_port}发来消息:{recv_data}')
# 发送数据
conn_socket.send('wobuhao'.encode(encoding='utf-8'))
#关闭套接字
conn_socket.close()
#定义方法
def start(self):
conn_socket,ip_port = self.tcp_server.accept()
# 定义一个方法,用于接受和发送消息
self.handle_client_request(conn_socket,ip_port)
#实例化对象 if__name__=='__main__':当前的实例化对象,旨在当前文件中调用
if __name__=='__main__':
ws=Webserver()
#调用方法
ws.start()
以上的tcp服务器接受到一条信息就会停止 所以使用while true 来使服务器一直等待连接
def start(self):
while True:
conn_socket,ip_port = self.tcp_server.accept()
# 定义一个方法,用于接受和发送消息
self.handle_client_request(conn_socket,ip_port)
########################################################################################
import socket
#创建一个webserver服务器
class Webserver(object):
#初始化方法__init__()魔术方法,用于对象初始化,将最常用的放到里面
def __init__(self):
#创建套接字对象
self.tcp_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#设置监听与绑定端口号
self.tcp_server.bind(('',9000)) #''默认ipv4端口
self.tcp_server.listen(128)
# 定义一个方法,用于接受和发送消息
def handle_client_request(self,conn_socket,ip_port):
#接受客户端消息
recv_data=conn_socket.recv(1024)
recv_data=recv_data.decode('utf-8')
print(f'端口{ip_port}发来消息:{recv_data}')
# 发送数据
conn_socket.send('wobuhao'.encode(encoding='utf-8'))
#关闭套接字
conn_socket.close()
#定义方法
def start(self):
while True:
conn_socket,ip_port = self.tcp_server.accept()
# 定义一个方法,用于接受和发送消息
self.handle_client_request(conn_socket,ip_port)
#实例化对象 if__name__=='__main__':当前的实例化对象,旨在当前文件中调用
if __name__=='__main__':
ws=Webserver()
#调用方法
ws.start()
针对于端口被占用的情况,我们也可以通过setsocket来进行端口复用
socket.SOL_SOCKET 代表代码最底层的套接字 socket.SO_REUSEADDR 代表要设置的特定的套接字选项,socket.SO_REUSEADDR允许在同一端口上启动一个新服务,即使在以前的服务器端口连接处于time_wait的状态,设置了这个选项以后,新的服务可以立即重用此端口。(因为一般情况下,当端口断开连接后,其还会保持一段时间接收服务端信息的状态) 端口占用错误信息为 :address already use
def __init__(self):
# 创建套接字对象
self.tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#设置端口服用 端口占用情况
self.tcp_server.setsockopt(socket.SOCK_STREAM,socket.SO_REUSEADDR,__value=True)
# 设置监听与绑定端口号
self.tcp_server.bind(('', 9000)) # ''默认ipv4端口
self.tcp_server.listen(128)
###########################################################################################
import socket
# 创建一个webserver服务器
class Webserver(object):
# 初始化方法__init__()魔术方法,用于对象初始化,将最常用的放到里面
def __init__(self):
# 创建套接字对象
self.tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#设置端口服用 端口占用情况
self.tcp_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,__value=True)
# 设置监听与绑定端口号
self.tcp_server.bind(('', 9000)) # ''默认ipv4端口
self.tcp_server.listen(128)
# 定义一个方法,用于接受和发送消息
def handle_client_request(self, conn_socket, ip_port):
# 接受客户端消息
recv_data = conn_socket.recv(1024)
recv_data = recv_data.decode('utf-8')
print(f'端口{ip_port}发来消息:{recv_data}')
# 发送数据
conn_socket.send('wobuhao'.encode(encoding='utf-8'))
# 关闭套接字
conn_socket.close()
# 定义方法
def start(self):
while True:
conn_socket, ip_port = self.tcp_server.accept()
# 定义一个方法,用于接受和发送消息
self.handle_client_request(conn_socket, ip_port)
# 实例化对象 if__name__=='__main__':当前的实例化对象,旨在当前文件中调用
if __name__ == '__main__':
ws = Webserver()
# 调用方法
ws.start()