服务端(server.py)
<span class="hljs-keyword">import</span> socket
<span class="hljs-comment"># 1、创建socket</span>
<span class="hljs-comment"># 参数1:选择使用ip类型,AF_INET代表ipv4,AF_INET6表示ipv6</span>
<span class="hljs-comment"># 参数2:选择协议,SOCK_STREAM表示TCP协议</span>
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
<span class="hljs-comment"># 2、绑定</span>
<span class="hljs-comment"># 参数是一个元组,元组的第一个元素为服务器本机IP,第二个元素为端口号,建议使用8000(8000以下的好多都是被其他程序所占用)以上的端口,最大使用到65535</span>
server.bind((<span class="hljs-string">"10.0.128.226"</span>, <span class="hljs-number">8000</span>))
<span class="hljs-comment"># 3、监听:设置最大连接数</span>
server.listen(<span class="hljs-number">40</span>)
<span class="hljs-comment"># 4、</span>
<span class="hljs-keyword">while</span> <span class="hljs-number">1</span>:
print(<span class="hljs-string">"等待客户端连接……"</span>)
<span class="hljs-comment"># 两个返回值,第一个返回值为连接的客户端的唯一标识,第二个返回值为客户端的ip地址</span>
clientSocket, clientAddr = server.accept()
print(<span class="hljs-string">"连接成功……"</span>)
print(clientSocket)
print(clientAddr)
<span class="hljs-comment">#接收数据</span>
data = clientSocket.recv(<span class="hljs-number">1024</span>)
print(<span class="hljs-string">"%s说:%s"</span>%(clientAddr[<span class="hljs-number">0</span>], data.decode(<span class="hljs-string">"utf-8"</span>)))
<span class="hljs-comment">#响应数据</span>
clientSocket.send(<span class="hljs-string">"You are right!"</span>.encode(<span class="hljs-string">"utf-8"</span>))
客户端(client.py)
<span class="hljs-keyword">import</span> socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
<span class="hljs-comment"># 参数是一个元组,元组的第一个元素为服务器所在机器的IP,第二个元素为端口号,为要连接的服务器开放的端口</span>
client.connect((<span class="hljs-string">"10.0.128.226"</span>, <span class="hljs-number">8000</span>))
<span class="hljs-comment"># 发送数据</span>
client.send(<span class="hljs-string">"zutuanxue_com is a good man"</span>.encode(<span class="hljs-string">"utf-8"</span>))
data = client.recv(<span class="hljs-number">1024</span>)
print(<span class="hljs-string">"服务器说:%s"</span>%(data.decode(<span class="hljs-string">"utf-8"</span>)))
服务器
main.py
<span class="hljs-keyword">from</span> server <span class="hljs-keyword">import</span> Server
<span class="hljs-keyword">from</span> db <span class="hljs-keyword">import</span> Db
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>:</span>
Db()
server = Server(<span class="hljs-number">4</span>, <span class="hljs-string">"TCP"</span>, <span class="hljs-string">"192.168.1.31"</span>, <span class="hljs-number">8081</span>, <span class="hljs-number">10</span>)
server.start()
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
main()
server.py
<span class="hljs-keyword">import</span> socket
<span class="hljs-keyword">from</span> interaction_thread <span class="hljs-keyword">import</span> InteractionThread
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">single</span><span class="hljs-params">(cls)</span>:</span>
instance = {}
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">inner</span><span class="hljs-params">(*args, **kwargs)</span>:</span>
<span class="hljs-keyword">if</span> cls <span class="hljs-keyword">not</span> <span class="hljs-keyword">in</span> instance:
instance[cls] = cls(*args, **kwargs)
<span class="hljs-keyword">return</span> instance[cls]
<span class="hljs-keyword">return</span> inner
<span class="hljs-meta">@single</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Server</span><span class="hljs-params">(object)</span>:</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self, ip4or6, protocol, ip, port, num)</span>:</span>
<span class="hljs-keyword">if</span> ip4or6 == <span class="hljs-number">4</span>:
self.ip4or6 = socket.AF_INET
<span class="hljs-keyword">else</span>:
self.ip4or6 = socket.AF_INET6
<span class="hljs-keyword">if</span> protocol.upper() == <span class="hljs-string">"TCP"</span>:
self.protocol = socket.SOCK_STREAM
<span class="hljs-keyword">else</span>:
self.protocol = socket.SOCK_DGRAM
self.socket = <span class="hljs-keyword">None</span>
self.ip = ip
self.port = port
self.num = num
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">start</span><span class="hljs-params">(self)</span>:</span>
self.socket = socket.socket(self.ip4or6, self.protocol)
self.socket.bind((self.ip, self.port))
self.socket.listen(self.num)
<span class="hljs-keyword">while</span> <span class="hljs-keyword">True</span>:
clientSocket, clientAddr = self.socket.accept()
print(<span class="hljs-string">"用户%s连接成功"</span> % (clientAddr[<span class="hljs-number">0</span>]))
<span class="hljs-comment"># 为每个用户开启一个线程,和用户进行交互</span>
InteractionThread(clientSocket, clientAddr).start()
user.py
客户端
main.py
from recv_thread import RecvThread
def main(): c = Client(4, “TCP”, “192.168.1.31”, 8081) c.start()
# 启动发送线程
sth = SendThread(c)
sth.start()
# 启动接收线程
rth = RecvThread(c)
rth.start()
# 等待发送与接收线程的结束
sth.join()
rth.join()
if name == “main”: main()
client.py
```python
import socket
def single(cls):
instance = {}
def inner(*args, **kwargs):
if cls not in instance:
instance[cls] = cls(*args, **kwargs)
return instance[cls]
return inner
@single
class Client(object):
def __init__(self, ip4or6, protocol, ip, port):
if ip4or6 == 4:
self.ip4or6 = socket.AF_INET
else:
self.ip4or6 = socket.AF_INET6
if protocol.upper() == "TCP":
self.protocol = socket.SOCK_STREAM
else:
self.protocol = socket.SOCK_DGRAM
self.socket = None
self.ip = ip
self.port = port
def start(self):
self.socket = socket.socket(self.ip4or6, self.protocol)
self.socket.connect((self.ip, self.port))
send_thread.py
<span class="hljs-keyword">import</span> threading
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">SendThread</span><span class="hljs-params">(threading.Thread)</span>:</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self, client)</span>:</span>
super().__init__()
self.client = client
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">run</span><span class="hljs-params">(self)</span>:</span>
<span class="hljs-keyword">while</span> <span class="hljs-keyword">True</span>:
<span class="hljs-comment"># 注册 register#account#passwd#name</span>
<span class="hljs-comment"># 登陆 login#account#passwd</span>
<span class="hljs-comment"># 群聊 talk#data</span>
<span class="hljs-comment"># 退出登录 quite#account</span>
<span class="hljs-comment"># 添加好友 add#account</span>
<span class="hljs-comment"># 验证好友添加 check#account#yes/no</span>
<span class="hljs-comment"># 与好友私聊 say#account#data</span>
<span class="hljs-comment"># 删除好友 del#account</span>
<span class="hljs-comment"># register#a#1#zutuanxue_com</span>
<span class="hljs-comment"># register#b#2#kaige</span>
<span class="hljs-comment"># register#c#3#kaishen</span>
<span class="hljs-comment"># talk#zutuanxue_com is a good man</span>
<span class="hljs-comment"># login#a#1</span>
<span class="hljs-comment"># login#b#2</span>
<span class="hljs-comment"># login#c#3</span>
<span class="hljs-comment"># quite#c</span>
<span class="hljs-comment"># add#b check#a#yes</span>
<span class="hljs-comment"># add#c check#b#no</span>
<span class="hljs-comment"># say#b#zutuanxue_com is a good man</span>
<span class="hljs-comment"># say#a#zutuanxue_com is a good man</span>
<span class="hljs-comment"># say#c#zutuanxue_com is a good man</span>
<span class="hljs-comment"># del#b</span>
data = input()
self.client.socket.send(data.encode(<span class="hljs-string">"utf-8"</span>))
recv_thread.py
<span class="hljs-keyword">import</span> threading
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">RecvThread</span><span class="hljs-params">(threading.Thread)</span>:</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self, client)</span>:</span>
super().__init__()
self.client = client
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">run</span><span class="hljs-params">(self)</span>:</span>
<span class="hljs-keyword">while</span> <span class="hljs-keyword">True</span>:
print(self.client.socket.recv(<span class="hljs-number">1024</span>).decode(<span class="hljs-string">"utf-8"</span>))