大牛阁下资源

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 294|回复: 8

lua代码写出tcp通讯的完整客户端和服务端

[复制链接]

111

主题

14

回帖

536

积分

管理员

积分
536
发表于 2024-11-25 11:46:11 | 显示全部楼层 |阅读模式
以下是一个简单的 Lua TCP 通讯实现,包含客户端和服务端的完整代码。客户端和服务端通过 TCP 协议进行通讯,客户端发送一条消息,服务端接收并返回一个响应。
1. 服务端 (TCP Server)

  1. -- TCP 服务端
  2. local socket = require("socket")

  3. -- 创建 TCP 服务端套接字
  4. local server = socket.tcp()

  5. -- 绑定 IP 和端口
  6. server:bind("127.0.0.1", 12345)

  7. -- 开始监听连接请求,最多允许 5 个连接
  8. server:listen(5)

  9. print("Server is waiting for connections...")

  10. -- 等待客户端连接
  11. local client = server:accept()

  12. print("Client connected!")

  13. -- 设置超时时间(可选)
  14. client:settimeout(10)  -- 设置 10 秒超时

  15. -- 循环接收客户端消息并返回响应
  16. while true do
  17.     local message, err = client:receive()  -- 接收客户端消息
  18.     if not message then
  19.         if err == "closed" then
  20.             print("Client disconnected.")
  21.             break
  22.         else
  23.             print("Error receiving message: " .. err)
  24.             break
  25.         end
  26.     end

  27.     print("Received from client: " .. message)

  28.     -- 发送响应给客户端
  29.     local response = "Server response: " .. message
  30.     client:send(response .. "\n")
  31. end

  32. -- 关闭客户端连接
  33. client:close()

  34. -- 关闭服务端套接字
  35. server:close()
复制代码



2. 客户端 (TCP Client)


  1. -- TCP 客户端
  2. local socket = require("socket")

  3. -- 创建 TCP 客户端套接字
  4. local client = socket.tcp()

  5. -- 连接到服务器
  6. local server_ip = "127.0.0.1"
  7. local server_port = 12345
  8. local success, err = client:connect(server_ip, server_port)

  9. if not success then
  10.     print("Error connecting to server: " .. err)
  11.     return
  12. end

  13. print("Connected to server!")

  14. -- 发送消息到服务器
  15. local message = "Hello, Server!"
  16. client:send(message .. "\n")
  17. print("Sent to server: " .. message)

  18. -- 接收服务器的响应
  19. client:settimeout(10)  -- 设置 10 秒超时
  20. local response, err = client:receive()

  21. if not response then
  22.     if err == "timeout" then
  23.         print("Timeout waiting for server response.")
  24.     else
  25.         print("Error receiving response: " .. err)
  26.     end
  27. else
  28.     print("Received from server: " .. response)
  29. end

  30. -- 关闭客户端连接
  31. client:close()
复制代码
解释:
  • 服务端 (server):
    • 使用 socket.tcp() 创建一个 TCP 套接字。
    • bind 将服务端套接字绑定到本地 IP 地址和端口(127.0.0.1:12345)。
    • listen 使服务端开始监听客户端连接,请求的最大排队数量为 5。
    • accept 等待并接受一个客户端的连接。
    • receive 用于接收客户端发送的消息。
    • 服务端收到消息后,通过 send 向客户端发送响应。
    • 如果客户端断开连接,服务端会捕获错误并退出循环。
  • 客户端 (client):
    • 使用 socket.tcp() 创建一个 TCP 客户端套接字。
    • connect 用于连接到指定的服务器 IP 和端口。
    • send 向服务端发送一条消息。
    • receive 用于接收服务端的响应。
    • 如果没有收到响应,客户端会捕获超时或错误。
运行步骤:
  • 启动服务端
    • 运行服务端脚本。服务端会等待来自客户端的连接。
    bash
    复制代码


    lua tcp_server.lua
  • 启动客户端
    • 在另一个终端运行客户端脚本。客户端会连接到服务端并发送一条消息。
    bash
    复制代码


    lua tcp_client.lua
  • 交互
    • 客户端发送消息后,服务端接收消息并返回响应。客户端收到响应后打印出来。
运行示例:假设服务端输出如下:
arduino
复制代码


Server is waiting for connections...Client connected!Received from client: Hello, Server!

客户端输出如下:
arduino
复制代码


Connected to server!Sent to server: Hello, Server!Received from server: Server response: Hello, Server!

进一步改进:
  • 并发连接
    • 当前的服务端只能处理一个客户端连接。为了支持多个客户端,可以使用 Lua 的协程(coroutine)或者创建多个线程(如果 Lua 环境支持多线程)。
  • 异常处理
    • 可以添加更多的错误处理和日志记录,确保服务端和客户端在出错时能给出清晰的提示。
  • 协议
    • 目前的通讯是基于简单的字符串传输。可以为客户端和服务端实现更复杂的协议(例如 JSON、二进制协议等),以便更好地支持不同的数据格式。


0

主题

255

回帖

538

积分

高级会员

积分
538
发表于 2024-11-28 06:01:59 | 显示全部楼层
感谢分享

111

主题

14

回帖

536

积分

管理员

积分
536
 楼主| 发表于 2024-12-12 11:06:21 | 显示全部楼层
99999999

0

主题

178

回帖

394

积分

中级会员

积分
394
发表于 2024-12-21 00:13:10 | 显示全部楼层
感谢楼主分享

0

主题

8

回帖

28

积分

新手上路

积分
28
发表于 2025-1-8 19:56:49 | 显示全部楼层
谢谢分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|大牛阁下资源网

GMT+8, 2025-1-23 04:05 , Processed in 0.103937 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表