Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save diyism/308e990693a42d23bdd055ed2653577d to your computer and use it in GitHub Desktop.
Save diyism/308e990693a42d23bdd055ed2653577d to your computer and use it in GitHub Desktop.
udp over http post with python and golang
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