文章详情
电脑本地部署deepseek-r1等扩展
Posted on 2025-01-08 07:34:46 by 主打一个C++
系统环境:windows
第一步:下载ollama网址: https://ollama.com/
进入页面:依次点击下载,如果是其他系统同理
等待下载完成:
下载完成后直接安装即可。
第二步:下载模型
回到首页,点击图中箭头
进入界面:
电脑不是很差的情况下,8b直接跑就行,大小比较适中,点击后进入下一步复制指令
打开cmd窗口(win+r)粘贴进去回车就会自动下载了。
等待下载完成后即可直接开始对话,如图:
测试对话:
慢慢玩,太牛逼了~~~
顺手写了个web ui 如图:
随手写的,只能说主要功能没问题。代码为单页,最下面可下载。
C++写的简单代理,破除ollama的同域策略:测试代码如下,ollama只要安装成功,直接运行下面代码会自动打开浏览器就可以对话了
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iostream>
#include <thread>
#include <fstream>
#include <string>
#pragma comment(lib, "ws2_32.lib")
#pragma warning (disable:4996)
#include <windows.h>
#include <tlhelp32.h>
#include <string>
#include <stdio.h>
std::string g_html = "";
bool readHtml() {
//读入html文件文本内容
std::ifstream ifs("deepseek.html", std::ios::in | std::ios::binary);
if (!ifs) {
std::cerr << "Failed to open file." << std::endl;
return 1;
}
std::string html((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
g_html = html;
}
// 处理客户端连接的线程函数
DWORD WINAPI ClientHandlerThread(LPVOID lpParam) {
SOCKET clientSocket = (SOCKET)lpParam;
std::string msg = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\nContent-Length: " + std::to_string(g_html.length()) + "\r\n\r\n" + g_html;
send(clientSocket, msg.c_str(), msg.length(), 0);
// 关闭客户端套接字
//closesocket(clientSocket);
return 0;
}
int Start() {
WSADATA wsaData;
SOCKET listenSocket = INVALID_SOCKET;
sockaddr_in service;
// 初始化 Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
std::cerr << "WSAStartup failed." << std::endl;
return 1;
}
// 创建监听套接字
listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listenSocket == INVALID_SOCKET) {
std::cerr << "Socket creation failed." << std::endl;
WSACleanup();
return 1;
}
//复用
int optval = 1;
setsockopt(listenSocket, SOL_SOCKET, SO_REUSEADDR, (const char*)&optval, sizeof(optval));
// 设置服务端地址信息
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("127.0.0.1");
service.sin_port = htons(9999);
// 绑定套接字
if (bind(listenSocket, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR) {
std::cerr << "Bind failed." << std::endl;
closesocket(listenSocket);
WSACleanup();
return 1;
}
// 开始监听
if (listen(listenSocket, SOMAXCONN) == SOCKET_ERROR) {
std::cerr << "Listen failed." << std::endl;
closesocket(listenSocket);
WSACleanup();
return 1;
}
std::cout << "Listening on 127.0.0.1:9999" << std::endl;
//打开网页
ShellExecuteA(NULL, "open", "http://127.0.0.1:9999", NULL, NULL, SW_SHOWNORMAL);
while (true) {
// 接受连接
SOCKET clientSocket = accept(listenSocket, NULL, NULL);
if (clientSocket == INVALID_SOCKET) {
std::cerr << "Accept failed." << std::endl;
closesocket(listenSocket);
WSACleanup();
return 1;
}
readHtml();
printf("Client connected.%lld\n", clientSocket);
std::string msg = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\nContent-Length: " + std::to_string(g_html.length()) + "\r\n\r\n" + g_html;
send(clientSocket, msg.c_str(), msg.length(), 0);
//break;
// 创建一个新线程来处理客户端连接
//std::thread clientThread(ClientHandlerThread, (LPVOID)clientSocket);
//clientThread.detach(); // 分离线程,使其在后台独立运行
}
// 关闭监听套接字
closesocket(listenSocket);
WSACleanup();
return 0;
}
bool isProcessRunning(const wchar_t* processName) {
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshot == INVALID_HANDLE_VALUE) {
return false;
}
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
// 获取第一个进程
if (!Process32First(hSnapshot, &pe)) {
CloseHandle(hSnapshot);
return false;
}
do {
if (wcscmp(pe.szExeFile, processName) == 0) {
CloseHandle(hSnapshot);
return true;
}
} while (Process32Next(hSnapshot, &pe));
CloseHandle(hSnapshot);
return false;
}
int isRunOllama() {
if (!isProcessRunning(L"ollama app.exe")) {
std::string appPath = "";
char* path = getenv("PATH");
//printf("PATH=%s\n", path);
char* token = strtok(path, ";");
while (token != NULL) {
//printf("%s\n", token);
if ((strstr(token, "Ollama") != nullptr) || (strstr(token, "ollama") != nullptr)) {
appPath = token;
appPath += "\\ollama app.exe";
printf("app=%s\n", appPath.c_str());
break;
}
token = strtok(NULL, ";");
}
if (appPath.empty()) {
printf("ollama app not found in PATH\n");
return 1;
}
//启动ollama app
HINSTANCE hInst = ShellExecuteA(NULL, "open", appPath.c_str(), NULL, NULL, SW_SHOWNORMAL);
if ((int)hInst <= 32) {
printf("ollama app launch failed\n");
return 1;
}
}
else {
printf("ollama app is running\n");
}
return 0;
}
int main() {
if (isRunOllama()) {
printf("环境没装好吧???\n结束");
system("pause");
return 1;
}
return Start();
}
*转载请注明出处:原文链接:https://cpp.vin/page/119.html