前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TCP编程

TCP编程

作者头像
星哥玩云
发布2022-09-08 20:51:16
7080
发布2022-09-08 20:51:16
举报
文章被收录于专栏:开源部署

一、客户端与服务端通信流程

截屏2020011413.39.07.png
截屏2020011413.39.07.png

二、客户端与服务端通信代码

服务端(server.py)

代码语言:javascript
复制
<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)

代码语言:javascript
复制
<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>)))

三、基于TCP实现聊天软件

截屏2020011414.25.16.png
截屏2020011414.25.16.png

服务器

main.py

代码语言:javascript
复制
<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

代码语言:javascript
复制
<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()

代码语言:javascript
复制
  # 启动发送线程
	sth = SendThread(c)
  sth.start()

	# 启动接收线程
	rth = RecvThread(c)
	rth.start()

	# 等待发送与接收线程的结束
	sth.join()
	rth.join()

if name == “main”: main()

代码语言:javascript
复制
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

代码语言:javascript
复制
  <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

代码语言:javascript
复制
<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>))
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、客户端与服务端通信流程
  • 二、客户端与服务端通信代码
  • 三、基于TCP实现聊天软件
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档