翼度科技»论坛 编程开发 python 查看内容

scoket用法

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
一.scoket基本介绍

1.scoket简介(以下是来自chatgpt回答)

1)Socket(套接字)是计算机网络中用于描述主机之间通信的一种机制。它定义了一种标准的接口,
      使得应用程序可以利用网络传输层提供的服务(如TCP或UDP)进行通信。
2)Socket的作用是在网络应用程序之间提供数据传输服务。通过Socket,应用程序可以将数据发送
      到网络上的另一个应用程序,并从网络上的另一个应用程序接收数据。
3)Socket还提供了一种机制,使得应用程序可以接收来自网络上的请求,并对这些请求进行响应。
     常见的网络应用程序,如Web服务器、邮件服务器、FTP服务器等都使用Socket技术。此外,许多P2P
   (点对点)应用程序,如BitTorrent、eMule等也使用Socket技术。Socket还可以用于实现各种网络应用
      程序,如网络游戏、聊天程序等。
2.建立TCP/IP连接

1)创建一个scoket对象
  1. socket_stream = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
复制代码
第一个参数表示通信协议类型
AF_INET:适用于网络通信
AF_UNIX:适用于本地进程间通信
第二个参数表示创建什么连接
SOCK_STREAM:表示tcp/ip连线
SOCK_DGRAM:表示udp连接
2)与服务端建立连接
  1. # 建立连接
  2. ip_port = ("ip", "port")  # 连接的服务端ip和端口
  3. socket_stream.connect(ip_port)  # 建立连接,出错不返回错误码
  4. socket_stream.connect_ex(ip_port)  # 出错时返回错误码,不抛异常
复制代码
connect()和connect_ex()选一个即可
3)发送数据
  1. # 发送数据
  2. data = 'hello'
  3. socket_stream.send(data.encode("utf-8"))  # 发送TCP数据,当send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完
  4. # or
  5. socket_stream.sendall(data.encode("utf-8"))  # 发送完整的TCP数据(循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
复制代码
当发送的数据较大时建议使用sendall发送
4)接收TCP数据
  1. # 接收TCP数据。1024(变量)表示每次最多接受1M字节的数据,recv()函数是一个阻塞函数,没有要接收的数据时,会一直等待,直到接收到数据或出现错误才会返回
  2. response_data = socket_stream.recv(1024)
复制代码
5)关闭连接
  1. # 关闭连接
  2. socket_stream.close()
复制代码
3.建立UDP连接

1)创建scoket对象
  1. client_dgram = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
复制代码
2)发送数据
  1. # 发送数据
  2. ip_port = ('127.0.0.1', 8080)
  3. data = 'Hello'
  4. client_dgram.sendto(data.encode("utf-8"), ip_port)
复制代码
这里发送用的是sendto()方法
3)接收数据
  1. # 接收UDP数据数据
  2. data = client_dgram.recvfrom(4096)
复制代码
4)关闭连接
  1. # 关闭连接
  2. client_dgram.close()
复制代码
二.使用scoket编写聊天程序

以下部分代码参考:https://www.yuque.com/imhelloworld/nov9az/bffcea259d3c96fb17a130acebc12801
聊天程序的话涉及两个端,既server和click。这里直接贴代码了,相关注释都是代码里
1)server
  1. import socket
  2. import threading
  3. # 服务器IP地址和端口号
  4. SERVER_IP = 'IP地址'
  5. SERVER_PORT = 端口号
  6. # 创建一个socket对象
  7. server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  8. # 绑定IP地址和端口号
  9. server_socket.bind((SERVER_IP, SERVER_PORT))
  10. # 设置最大连接数,超过10后拒绝。0的话表示不接受连接,直接拒绝
  11. server_socket.listen(10)
  12. # 客户端列表
  13. clients = []
  14. def handle_client(client_socket):
  15.     while True:
  16.         try:
  17.             # 接收客户端发送的消息
  18.             message = client_socket.recv(10240).decode('utf-8')
  19.             print("打印", message)
  20.             if message == 'quert':
  21.                 client_socket.send(message.encode('utf-8'))
  22.             else:
  23.                 # 广播消息给所有客户端
  24.                 for c in clients:
  25.                     if c != client_socket:
  26.                         c.send(message.encode('utf-8'))
  27.         except:
  28.             # 发生异常时关闭连接
  29.             client_socket.close()
  30.             clients.remove(client_socket)
  31.             print("发送异常了")
  32.             break
  33. # 循环监听客户端连接
  34. while True:
  35.     print('Waiting for client connections...')
  36.     # 接受客户端连接请求,新的客户端请求时创建一个新的socket,用于处理客户端的请求,原有的socket继续监听其他客户端的连接请求;
  37.     # 函数是一个阻塞函数,当没有客户端连接请求时,会一直等待,直到有客户端连接请求到达
  38.     client_socket, client_address = server_socket.accept()
  39.     print('客户socket', client_socket, 'ip和端口', client_address)
  40.     clients.append(client_socket)
  41.     # 创建一个新的线程处理客户端连接
  42.     client_thread = threading.Thread(target=handle_client, args=(client_socket, ))
  43.     client_thread.start()
复制代码
2)click
  1. import socket
  2. import threading
  3. import time
  4. # 服务器IP地址和端口号
  5. SERVER_IP = 'IP地址'
  6. SERVER_PORT = 端口号
  7. # 创建一个socket对象
  8. client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  9. # 连接服务器
  10. client_socket.connect((SERVER_IP, SERVER_PORT))
  11. def receive():
  12.     while True:
  13.         try:
  14.             # 接收服务器发送的消息
  15.             message = client_socket.recv(1024).decode('utf-8')
  16.             if message == 'quert':
  17.                 client_socket.close()
  18.                 break
  19.             print('\n对方回答:', message)
  20.         except:
  21.             # 发生异常时关闭连接
  22.             client_socket.close()
  23.             break
  24. def send():
  25.     while True:
  26.         # 获取用户输入的消息
  27.         message = input()
  28.         if message == 'quert':
  29.             client_socket.close()
  30.             print('连接断开,通信结束')
  31.             break
  32.         else:
  33.             # 发送消息给服务器
  34.             client_socket.send(message.encode('utf-8'))
  35. # 创建两个线程,分别用于接收和发送消息
  36. receive_thread = threading.Thread(target=receive)
  37. send_thread = threading.Thread(target=send)
  38. # 启动线程
  39. receive_thread.start()
  40. send_thread.start()
复制代码
这里需要注意的是,既然是聊天程序,那么肯定涉及两个click,两个click代码一致即可,运行时先运行server,后运行click,之后就可以在Terminal下建立对话了。
以上是click在同一台电脑上,若不在同一台电脑的,建立对话需在同一个局域网下,ip地址在dos窗口下输入ipconfig\all即可查看,端口号可随便填个,只要不被占用就行。

三.scoket+chatgpt建立搜索对话框

1)获取chatgpt搜索接口,这里就直接贴代码了
  1. def api(params, tokened="token"):
  2.     url = "https://api.aigcfun.com/api/v1/text?key=" + tokened
  3.     data = {"messages": [{"role": "system", "content": "请以markdown的形式返回答案"},
  4.                          {"role": "user", "content": params}], "tokensLength": 32, "model": "gpt-3.5-turbo"}
  5.     response_data = requests.post(url=url, json=data)
  6.     return response_data.json()["choices"][0]["text"]
复制代码
params为用户问的问题,return返回的是chatgpt回答的答案
2)获取到chatgpt的回答内容后返回给服务端
  1. def receive():
  2.     while True:
  3.         try:
  4.             # 接收服务器发送的消息
  5.             message = client_socket.recv(1024).decode('utf-8')
  6.             data_message = api(message)
  7.             while data_message == None:  # 由于chatgpt有时响应的比较慢,这里需添加个循环判断
  8.                 continue
  9.             # if data_message == '您今日使用次数已达上限,请明日再试!':
  10.             #     data_message = api(params=message, tokened=token())
  11.             client_socket.send(data_message.encode('utf-8'))  # 发送chatgpt回答的问题给服务端
  12.         except:
  13.             # 发生异常时关闭连接
  14.             client_socket.close()
  15.             break
复制代码
3)目前chatpgt虽是免费的,但每天都有次数限制,所以可以请求获取token的接口来获取新的token。这里就不做演示了(hhhhhh.........)

 

来源:https://www.cnblogs.com/lihongtaoya/p/17276968.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具