一.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对象

socket_stream = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

第一个参数表示通信协议类型

AF_INET:适用于网络通信

AF_UNIX:适用于本地进程间通信

第二个参数表示创建什么连接

SOCK_STREAM:表示tcp/ip连线

SOCK_DGRAM:表示udp连接

2)与服务端建立连接

# 建立连接
ip_port = ("ip", "port") # 连接的服务端ip和端口
socket_stream.connect(ip_port) # 建立连接,出错不返回错误码
socket_stream.connect_ex(ip_port) # 出错时返回错误码,不抛异常

connect()和connect_ex()选一个即可

3)发送数据

# 发送数据
data = 'hello'
socket_stream.send(data.encode("utf-8")) # 发送TCP数据,当send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完
# or
socket_stream.sendall(data.encode("utf-8")) # 发送完整的TCP数据(循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)

当发送的数据较大时建议使用sendall发送

4)接收TCP数据

# 接收TCP数据。1024(变量)表示每次最多接受1M字节的数据,recv()函数是一个阻塞函数,没有要接收的数据时,会一直等待,直到接收到数据或出现错误才会返回
response_data = socket_stream.recv(1024)

5)关闭连接

# 关闭连接
socket_stream.close()

3.建立UDP连接

1)创建scoket对象

client_dgram = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

2)发送数据

# 发送数据
ip_port = ('127.0.0.1', 8080)
data = 'Hello'
client_dgram.sendto(data.encode("utf-8"), ip_port)

这里发送用的是sendto()方法

3)接收数据

# 接收UDP数据数据
data = client_dgram.recvfrom(4096)

4)关闭连接

# 关闭连接
client_dgram.close()

二.使用scoket编写聊天程序

以下部分代码参考:https://www.yuque.com/imhelloworld/nov9az/bffcea259d3c96fb17a130acebc12801

聊天程序的话涉及两个端,既server和click。这里直接贴代码了,相关注释都是代码里

1)server

import socket
import threading # 服务器IP地址和端口号
SERVER_IP = 'IP地址'
SERVER_PORT = 端口号
# 创建一个socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定IP地址和端口号
server_socket.bind((SERVER_IP, SERVER_PORT))
# 设置最大连接数,超过10后拒绝。0的话表示不接受连接,直接拒绝
server_socket.listen(10)
# 客户端列表
clients = [] def handle_client(client_socket):
while True:
try:
# 接收客户端发送的消息
message = client_socket.recv(10240).decode('utf-8')
print("打印", message)
if message == 'quert':
client_socket.send(message.encode('utf-8'))
else:
# 广播消息给所有客户端
for c in clients:
if c != client_socket:
c.send(message.encode('utf-8'))
except:
# 发生异常时关闭连接
client_socket.close()
clients.remove(client_socket)
print("发送异常了")
break # 循环监听客户端连接
while True:
print('Waiting for client connections...')
# 接受客户端连接请求,新的客户端请求时创建一个新的socket,用于处理客户端的请求,原有的socket继续监听其他客户端的连接请求;
# 函数是一个阻塞函数,当没有客户端连接请求时,会一直等待,直到有客户端连接请求到达
client_socket, client_address = server_socket.accept()
print('客户socket', client_socket, 'ip和端口', client_address)
clients.append(client_socket)
# 创建一个新的线程处理客户端连接
client_thread = threading.Thread(target=handle_client, args=(client_socket, ))
client_thread.start()

2)click

import socket
import threading
import time # 服务器IP地址和端口号
SERVER_IP = 'IP地址'
SERVER_PORT = 端口号
# 创建一个socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
client_socket.connect((SERVER_IP, SERVER_PORT)) def receive():
while True:
try:
# 接收服务器发送的消息
message = client_socket.recv(1024).decode('utf-8')
if message == 'quert':
client_socket.close()
break
print('\n对方回答:', message)
except:
# 发生异常时关闭连接
client_socket.close()
break def send():
while True:
# 获取用户输入的消息
message = input()
if message == 'quert':
client_socket.close()
print('连接断开,通信结束')
break
else:
# 发送消息给服务器
client_socket.send(message.encode('utf-8')) # 创建两个线程,分别用于接收和发送消息
receive_thread = threading.Thread(target=receive)
send_thread = threading.Thread(target=send)
# 启动线程
receive_thread.start()
send_thread.start()

这里需要注意的是,既然是聊天程序,那么肯定涉及两个click,两个click代码一致即可,运行时先运行server,后运行click,之后就可以在Terminal下建立对话了。

以上是click在同一台电脑上,若不在同一台电脑的,建立对话需在同一个局域网下,ip地址在dos窗口下输入ipconfig\all即可查看,端口号可随便填个,只要不被占用就行。

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

1)获取chatgpt搜索接口,这里就直接贴代码了

def api(params, tokened="token"):
url = "https://api.aigcfun.com/api/v1/text?key=" + tokened
data = {"messages": [{"role": "system", "content": "请以markdown的形式返回答案"},
{"role": "user", "content": params}], "tokensLength": 32, "model": "gpt-3.5-turbo"}
response_data = requests.post(url=url, json=data)
return response_data.json()["choices"][0]["text"]

params为用户问的问题,return返回的是chatgpt回答的答案

2)获取到chatgpt的回答内容后返回给服务端

def receive():
while True:
try:
# 接收服务器发送的消息
message = client_socket.recv(1024).decode('utf-8')
data_message = api(message)
while data_message == None: # 由于chatgpt有时响应的比较慢,这里需添加个循环判断
continue
# if data_message == '您今日使用次数已达上限,请明日再试!':
# data_message = api(params=message, tokened=token()) client_socket.send(data_message.encode('utf-8')) # 发送chatgpt回答的问题给服务端
except:
# 发生异常时关闭连接
client_socket.close()
break

3)目前chatpgt虽是免费的,但每天都有次数限制,所以可以请求获取token的接口来获取新的token。这里就不做演示了(hhhhhh.........)

scoket用法的更多相关文章

  1. scoket模块 粘包问题 tcp协议特点 重启服务器会遇到地址被占用问题

    scoket()模块函数用法 import socket socket.socket(socket_family,socket_type,protocal=0) 获取tcp/ip套接字 tcpsock ...

  2. EditText 基本用法

    title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...

  3. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  4. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  5. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  6. python enumerate 用法

    A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...

  7. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

  8. 【JavaScript】innerHTML、innerText和outerHTML的用法区别

    用法: <div id="test">   <span style="color:red">test1</span> tes ...

  9. chattr用法

    [root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...

  10. 萌新笔记——vim命令“=”、“d”、“y”的用法(结合光标移动命令,一些场合会非常方便)

    vim有许多命令,网上搜有一堆贴子.文章列举出各种功能的命令. 对于"="."d"."y",我在无意中发现了它们所具有的相同的一些用法,先举 ...

随机推荐

  1. python 时间戳转日期 不自动补零 without zero-padding

    1. 时间戳转日期 代码 import time timestamp = 1568171336 time_format = "%Y-%m-%d %H:%M:%S" time_loc ...

  2. excel的几个常用方法

    --笔记开始: 1.if(条件,真值,假值),类似于编程语言中的三元运算符.条件为真时返回真值,条件为假时返回假值. 2.match(目标值,查找区域,查找类型),一般查找类型为0(等值查找),查找区 ...

  3. Ribbon负载均衡的实现流程简要分析

    SpringCloud中使用Netflix方案做分布式时,只需要在RestTemplate的bean定义上加一个注解@LoadBalanced,无需做其它任何操作就可以开启负载均衡,怎么做到的呢? 不 ...

  4. 【python】第二模块 步骤一 第二课、数据库表的相关操作

    第二课.数据库表的相关操作 一.课程介绍 1.1 课程介绍 学习目标 管理逻辑库和数据表 创建.删除.修改逻辑库和数据表 了解常用的数据类型和约束 字符串.整数.浮点数.精确数字.日期.枚举.主要约束 ...

  5. PLC入门笔记10

    梯形图电路之顺序控制 顺序控制功能图 顺序控制功能图的梯形图表达 编程原则 实例分析 SMo0.1西门子首次扫描时为ON,常用作初始化脉冲 这是台达的 这是优控的..

  6. php 验证身份证合法性

    function checkIdcard($num = '') { $length = strlen($num); if ($length == 15) { //如果是15位身份证 //15位身份证没 ...

  7. ES2015常用知识点

    ES2015(又称ES6)部分1 let/const以及块作用域:2 循环语句 const arr=[1,2,3]; for(const item of arr){ console.log(item) ...

  8. 【ES6】迭代器

    简介 在 JavaScript 中,迭代器是一个对象,它定义一个序列,并在终止时可能返回一个返回值. 更具体地说,迭代器是通过使用 next() 方法实现迭代器协议的任何一个对象,该方法返回具有两个属 ...

  9. C/C++ 数据结构优先级队列的实现(使用二级指针)

    #include <iostream> #include <Windows.h> #include <iomanip> //优先级队列的实现 using names ...

  10. .net 学习必须学的书籍,新手必备,老手升级必须品!!!

    最近看到一篇文章 是关于学习.net的数据 给大家看看. <<第一篇:>> 人身为一个典型的技术宅,平时看了一些技术书籍.算不上是"博览群书",但也涉猎不少 ...