LFq51qqupnaiTNn39w6zATiOTxZI2JYuRJEBlzmUDv4zeeNlXhMgJZVb0q5QkLr+CIUrSuNB7ucifrGXawLB4qswPOXYG7+ItDNUR/9UkLTUWlnHLX07hnR1USOrWIjTmbytcIKEdaI6x0RskyotuItj84xxoSBP/iRBW2EHpOc
Socket对象方法:
服务端:
函数 | 描述 |
.bind() | 绑定地址关键字,AF_INET下以元组的形式表示地址。常用bind((host,port)) |
.listen() | 监听TCP,可以挂起的最大连接数,该值至少为1,一般设为5即可 |
.accept() | 被动接受TCP客户端的连接 |
客户端: |
函数 | 描述 |
.connect() | 初始化服务器连接 |
.connect_ex() | 是对connect()函数的扩展,当出错时返回出错码,不报异常 |
其它函数: |
函数 | 描述 |
.recv() | 接收数据,数据以字符串的形式返回,bufsize指定接收的最大数据量。 |
.send() | 发送数据,将string中的数据发送到连接的套接字,返回值是要发送的字节数量,通常使用.encode()函数对数据进行转码 |
.senddall() | 发送完整的数据,在返回之前会尝试发送所有数据,成功返回None,失败则抛出异常。 |
.recvfrom() | 与recv()函数类似,不同的是返回值是(data,address),其中data是包含接收数据的字符串,address是发送数据的套接字地址。 |
.sendto() | 发送UDP数据,将数据发送到套接字,形式是(ipaddr,port)的元组。 |
.close() | 关闭套接字 |
服务端
使用socket函数来创建一个socket对象,并设置一个socket服务,然后通过bind(hostname,port)函数来指定一个端口,使用socket对象的accept方法,等待客户端的连接,并返回connection对象。
具体步骤为
from socketserver import BaseRequestHandler, TCPServer
import socket
from socket import *
import time
import sys
def is_number(s):
try:
float(s)
return True
except ValueError:
pass
try:
import unicodedata
unicodedata.numeric(s)
return True
except (TypeError, ValueError):
pass
return False
class test(BaseRequestHandler):
def handle(self):
# self.client_address连接的客户端
print('Got connection from', self.client_address)
# 获取客服端请求
msg = (self.request.recv(16)).decode('gbk')
print(msg)
while True:
if is_number(msg) is True:
if 1==int(msg):
remsg = bytes('bind()和connect()函数:绑定套接字并建立连接', encoding='gbk')
print('bind()和connect()函数:绑定套接字并建立连接')
self.request.send(remsg)
break
elif 2==int(msg):
remsg = bytes('.listen() 监听TCP,可以挂起的最大连接数,该值至少为1,一般设为5即可', encoding='gbk')
print('.listen() 监听TCP,可以挂起的最大连接数,该值至少为1,一般设为5即可')
self.request.send(remsg)
break
elif 3 == int(msg):
remsg = bytes('.accept() 被动接受TCP客户端的连接', encoding='gbk')
print('.accept() 被动接受TCP客户端的连接')
self.request.send(remsg)
break
elif 4 == int(msg):
remsg = bytes('函数 描述.connect() 初始化服务器连接', encoding='gbk')
print('函数 描述.connect() 初始化服务器连接')
self.request.send(remsg)
break
elif 5 == int(msg):
remsg = bytes('.send() 发送数据,将string中的数据发送到连接的套接字,返回值是要发送的字节数量,通常使用.encode()函数对数据进行转码', encoding='gbk')
print('.send() 发送数据,将string中的数据发送到连接的套接字,返回值是要发送的字节数量,通常使用.encode()函数对数据进行转码')
self.request.send(remsg)
break
elif 6 == int(msg):
remsg = bytes('.close() 关闭套接字', encoding='gbk')
print('.close() 关闭套接字')
self.request.send(remsg)
break
else:
remsg = bytes('不在范围内', encoding='gbk')
print('不在范围内')
self.request.send(remsg)
break
elif msg == '我想要年薪百万':
remsg = bytes('%s付出别人几倍的辛苦就可以年薪百万'%time.strftime("%Y-%m-%d %H:%M:%S"), encoding='gbk')
print('%s付出别人几倍的辛苦就可以年薪百万'%time.strftime("%Y-%m-%d %H:%M:%S"))
self.request.send(remsg)
break
elif b'aaa' == msg:
remsg = bytes('%saaaaaaaa'%time.strftime("%Y-%m-%d %H:%M:%S"), encoding='gbk')
print('%saaaaaaaa'%time.strftime("%Y-%m-%d %H:%M:%S"))
self.request.send(remsg)
break
elif 'exit' == msg:
remsg1 = bytes('%s结束连接'%time.strftime("%Y-%m-%d %H:%M:%S"), encoding='gbk')
self.request.sendall(remsg1)
print('%s结束连接'%time.strftime("%Y-%m-%d %H:%M:%S"))
break
else:
remsg = bytes('呜呜呜呜呜呜呜呜无无无无无无无无无无无无', encoding='gbk')
print('呜呜呜呜呜呜呜呜无无无无无无无无无无无无')
self.request.send(remsg)
break
if __name__ == '__main__':
from threading import Thread
# 绑定socket服务端所在ip和端口号
serv = TCPServer(('127.0.0.1', 20003), test)
serv.serve_forever()
客户端
创建一个客户端用来连接以上服务的的服务,使用socket.connect()方法打开一个TCP连接到主机,连接后可以从服务端获取数据,在操作完成后关闭连接。 具体步骤为: ``` 创建客户端的套接字 client=socket() 尝试连接服务器 client.connect() 发送并接收数据 client.send() client.recv() 关闭客户端套接字 client.close() ``` **具体代码实现:**
from socket import socket,AF_INET,SOCK_STREAM
#服务端的ip地址
server_ip = '127.0.0.1'
#服务端socket绑定的端口号
server_port = 20003
if __name__ == '__main__':
while True:
str_msg = input("请输入要发送信息:")
if str_msg != "":
bytes_msg = bytes(str_msg, encoding = "gbk")
client = socket(AF_INET,SOCK_STREAM)
print(client)
client.connect((server_ip,server_port))
client.send(bytes_msg)
print(str(client.recv(8192),encoding="gbk"))
client.close()
客户端发送信息是服务端设置的返回信息