Last active
May 6, 2024 09:16
-
-
Save diyism/308e990693a42d23bdd055ed2653577d to your computer and use it in GitHub Desktop.
udp over http post with python and golang
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
llama3-70b-8192的翻译是有问题的, 会导致1024字节缓冲区的后半段数据(下一个udp包的不完整前半部)作为一个udp包发送 | |
claude-3-opus-20240229的翻译 性能好于 gpt-4-turbo-2024-04-09的翻译 | |
=================================python gpt4 生成 65行============================================================ | |
import aiohttp | |
from aiohttp import web | |
import socket | |
import base64 | |
import asyncio | |
#test command: | |
#(printf "POST / HTTP/1.1\r\nHost: 127.0.0.1\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length:10000000000\r\n\r\n"; cat) | nc localhost 1081 | |
#YWFhYWFhYWFhYWFhYWE=<enter key> | |
# UDP服务器地址 | |
UDP_IP = "127.0.0.1" | |
UDP_PORT = 1082 | |
async def handle_post(request): | |
# 用于存储接收到的数据 | |
data = bytearray() | |
reader = request.content | |
# 逐行读取和处理数据 | |
while True: | |
line = await reader.readline() | |
if not line: | |
#print("Empty line") | |
await asyncio.sleep(0.5) # 异步睡眠0.1秒 | |
continue # 如果读取到空行,则忽略 | |
# 对每一行的 base64 数据进行解码 | |
try: | |
decoded_line = base64.b64decode(line.strip()) | |
data.extend(decoded_line) | |
print(decoded_line) | |
except base64.binascii.Error as e: | |
print(f"Base64 decoding error: {e}") | |
# 发送数据到UDP服务器 | |
loop = asyncio.get_running_loop() | |
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | |
# 包装socket以使用异步发送 | |
transport, _ = await loop.create_datagram_endpoint( | |
lambda: asyncio.DatagramProtocol(), | |
remote_addr=(UDP_IP, UDP_PORT) | |
) | |
transport.sendto(data) | |
transport.close() | |
return web.Response(text="POST request processed") | |
async def run_app(): | |
app = web.Application() | |
app.router.add_post('/', handle_post) | |
runner = web.AppRunner(app) | |
await runner.setup() | |
site = web.TCPSite(runner, 'localhost', 1081) | |
print(f'Starting aiohttp server on port 1081...') | |
await site.start() | |
# 服务器将一直运行,直到被手动停止 | |
while True: | |
await asyncio.sleep(3600) # 每小时休眠一次,以保持服务运行 | |
if __name__ == "__main__": | |
asyncio.run(run_app()) | |
====================golang llama3-70b-8192 从python翻译 64行======================================================== | |
package main | |
import ( | |
"encoding/base64" | |
"fmt" | |
"net" | |
"net/http" | |
"bytes" | |
) | |
const ( | |
udpIP = "127.0.0.1" | |
udpPort = 1082 | |
) | |
func handlePost(w http.ResponseWriter, r *http.Request) { | |
data := make([]byte, 0) | |
reader := r.Body | |
buf := make([]byte, 1024) | |
for { | |
n, err := reader.Read(buf) | |
if err != nil { | |
break | |
} | |
for _, line := range bytes.Split(buf[:n], []byte("\n")) { | |
if len(line) == 0 { | |
continue | |
} | |
decodedLine, err := base64.StdEncoding.DecodeString(string(line)) | |
if err != nil { | |
fmt.Println(err) | |
continue | |
} | |
fmt.Println(string(decodedLine)) | |
data = append(data, decodedLine...) | |
} | |
} | |
udpAddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", udpIP, udpPort)) | |
if err != nil { | |
fmt.Println(err) | |
return | |
} | |
conn, err := net.DialUDP("udp", nil, udpAddr) | |
if err != nil { | |
fmt.Println(err) | |
return | |
} | |
defer conn.Close() | |
_, err = conn.Write(data) | |
if err != nil { | |
fmt.Println(err) | |
return | |
} | |
w.Write([]byte("POST request processed")) | |
} | |
func main() { | |
http.HandleFunc("/", handlePost) | |
fmt.Println("Starting HTTP server on port 1081...") | |
http.ListenAndServe(":1081", nil) | |
} | |
===========================golang claude-3-opus-20240229从python翻译 79行=========================== | |
package main | |
import ( | |
"bufio" | |
"encoding/base64" | |
"fmt" | |
"log" | |
"net" | |
"net/http" | |
"time" | |
) | |
const ( | |
udpIP = "127.0.0.1" | |
udpPort = 1082 | |
) | |
func handlePost(w http.ResponseWriter, r *http.Request) { | |
// 用于存储接收到的数据 | |
data := make([]byte, 0) | |
// 创建一个缓冲读取器 | |
reader := bufio.NewReader(r.Body) | |
// 逐行读取和处理数据 | |
for { | |
line, err := reader.ReadBytes('\n') | |
if err != nil { | |
if err.Error() == "EOF" { | |
time.Sleep(500 * time.Millisecond) // 睡眠0.5秒 | |
continue // 如果读取到EOF,则忽略 | |
} | |
log.Printf("Error reading request body: %v", err) | |
break | |
} | |
// 对每一行的 base64 数据进行解码 | |
decodedLine, err := base64.StdEncoding.DecodeString(string(line[:len(line)-1])) | |
if err != nil { | |
log.Printf("Base64 decoding error: %v", err) | |
continue | |
} | |
data = append(data, decodedLine...) | |
fmt.Println(string(decodedLine)) | |
} | |
// 发送数据到UDP服务器 | |
udpAddr, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", udpIP, udpPort)) | |
if err != nil { | |
log.Printf("Error resolving UDP address: %v", err) | |
return | |
} | |
conn, err := net.DialUDP("udp", nil, udpAddr) | |
if err != nil { | |
log.Printf("Error dialing UDP: %v", err) | |
return | |
} | |
defer conn.Close() | |
_, err = conn.Write(data) | |
if err != nil { | |
log.Printf("Error sending UDP data: %v", err) | |
return | |
} | |
w.Write([]byte("POST request processed")) | |
} | |
func main() { | |
http.HandleFunc("/", handlePost) | |
log.Println("Starting server on port 1081...") | |
err := http.ListenAndServe(":1081", nil) | |
if err != nil { | |
log.Fatal("ListenAndServe: ", err) | |
} | |
} | |
===============================golang gpt-4-turbo-2024-04-09 从python 翻译 95行============ | |
package main | |
import ( | |
"encoding/base64" | |
"fmt" | |
"io" | |
"net" | |
"net/http" | |
"strings" | |
"time" | |
) | |
// UDP server address | |
const ( | |
UDP_IP = "127.0.0.1" | |
UDP_PORT = "1082" | |
) | |
func handlePost(w http.ResponseWriter, r *http.Request) { | |
// Create a UDP connection | |
conn, err := net.Dial("udp", UDP_IP+":"+UDP_PORT) | |
if err != nil { | |
fmt.Fprintf(w, "Failed to connect to UDP server: %v", err) | |
return | |
} | |
defer conn.Close() | |
// Read the request body | |
data := make([]byte, 0) | |
reader := r.Body | |
defer reader.Close() | |
for { | |
line, err := readLine(reader) | |
if err != nil { | |
if err == io.EOF { | |
break | |
} | |
fmt.Fprintf(w, "Error reading line: %v", err) | |
return | |
} | |
if line == "" { | |
time.Sleep(500 * time.Millisecond) | |
continue | |
} | |
// Decode base64 data | |
decoded, err := base64.StdEncoding.DecodeString(strings.TrimSpace(line)) | |
if err != nil { | |
fmt.Printf("Base64 decoding error: %v\n", err) | |
continue | |
} | |
fmt.Println(string(decoded)) | |
data = append(data, decoded...) | |
} | |
// Send data to UDP server | |
_, err = conn.Write(data) | |
if err != nil { | |
fmt.Fprintf(w, "Failed to send data to UDP server: %v", err) | |
return | |
} | |
fmt.Fprint(w, "POST request processed") | |
} | |
func readLine(reader io.Reader) (string, error) { | |
buf := make([]byte, 0, 4096) | |
for { | |
b := make([]byte, 1) | |
n, err := reader.Read(b) | |
if err != nil { | |
if err == io.EOF && len(buf) > 0 { | |
return string(buf), nil | |
} | |
return "", err | |
} | |
if n > 0 { | |
if b[0] == '\n' { | |
break | |
} | |
buf = append(buf, b[0]) | |
} | |
} | |
return string(buf), nil | |
} | |
func main() { | |
http.HandleFunc("/", handlePost) | |
fmt.Println("Starting HTTP server on port 1081...") | |
if err := http.ListenAndServe("localhost:1081", nil); err != nil { | |
fmt.Printf("Failed to start server: %v\n", err) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment