注意:下面代码con 不能放在循环内,否则会一直不断连接,自行更改。

服务器server.lua

socket.bind( ) 创建接口

  1. --服务器端/虚拟机 文件名server.lua
  2. local socket = require("socket")
  3. --服务器IP地址
  4. local host = "10.0.0.201"
  5. --自定义端口
  6. local port = "8080"
  7. --创建IP接口,设置每段接收1024字节数据
  8. local server = socket.bind(host, port, 1024)
  9. local i = 0
  10. print("服务器已启动监听!" .. host)
  11. while true do
  12. i = i + 1
  13. --监听client.lua的请求,不是阻塞
  14. local con = server:accept()
  15. --接收到请求连接就会打印i,否则不会打印,不是阻塞
  16. print(i)
  17. end

con:receive( )—接收字符串

  1. --连接成功con不等于nil值,失败则等于nil
  2. if con then
  3. --接收字符串
  4. local src = con:receive()
  5. print(src)
  6. end

con:send( ) —发送字符串

  1. --连接成功con不等于nil值,失败则等于nil
  2. if con then
  3. --con连接成功,才能发送字符串,\n代表数据结尾
  4. con:send("hello".."\n")
  5. end

socket.select( ) —判断是否有接收字符串

//如果手机端没有运行con:send( )—发送字符串,而服务端运行了con:receive( )—接收字符串,那么就会导致服务端一直处于监听,不会继续执行代码,超过设定时间才会超时继续执行。
完整代码:

  1. --服务器端/虚拟机 文件名server.lua
  2. local socket = require("socket")
  3. --服务器IP地址
  4. local host = "10.0.0.201"
  5. --自定义端口
  6. local port = "8080"
  7. --创建IP接口,设置每段接收1024字节数据
  8. local server = socket.bind(host, port, 1024)
  9. local i = 0
  10. print("服务器已启动监听!" .. host)
  11. while true do
  12. i = i + 1
  13. --监听client.lua的请求,不是阻塞
  14. local con = server:accept()
  15. --接收到请求连接就会打印i,否则不会打印,不是阻塞
  16. print(i)
  17. --连接成功con不等于nil值,失败则等于nil
  18. if con then
  19. --con连接成功,才能发送字符串,\n代表数据结尾
  20. con:send("hello".."\n")
  21. --把con丢进去判断是否有接收到字符串数据,1为超时时间,结果返回table
  22. local recvt, sendt, status = socket.select({con}, nil, 1)
  23. if #recvt > 0 then
  24. --接收字符串
  25. local src = con:receive()
  26. print(src)
  27. end
  28. end
  29. end

手机端client.lua

socket.connect( )—发送请求

  1. --客户端/手机端 文件名client.lua
  2. local socket = require("bblibs.socket.socket")
  3. --对应server.luaIP地址
  4. local host = "10.0.0.201"
  5. --对应server.lua的端口
  6. local port = "8080"
  7. local i = 0
  8. while true do
  9. i = i + 1
  10. --发送请求,这里要注意:IP与端口不一致会导致阻塞,导致程序卡死
  11. local con = socket.connect(host, port)
  12. --如果是正常的IP地址,就会打印i,说明不阻塞
  13. print(i)
  14. end

con:receive( )—接收字符串

  1. --连接成功con不等于nil值,失败则等于nil
  2. if con then
  3. --接收字符串
  4. local src = con:receive()
  5. print(src)
  6. end

con:send( ) —发送字符串
  1. --连接成功con不等于nil值,失败则等于nil
  2. if con then
  3. --con连接成功,才能发送字符串,\n代表数据结尾
  4. con:send("hello".."\n")
  5. end

socket.select( ) —判断是否有接收字符串

//如果服务端没有运行con:send( )—发送字符串,而手机端运行了con:receive( )—接收字符串,那么就会导致手机端一直处于监听,不会继续执行代码,超过设定时间才会超时继续执行。
完整代码:

  1. --客户端/手机端 文件名client.lua
  2. local socket = require("bblibs.socket.socket")
  3. --对应server.luaIP地址
  4. local host = "10.0.0.201"
  5. --对应server.lua的端口
  6. local port = "8080"
  7. local i = 0
  8. while true do
  9. i = i + 1
  10. --发送请求,这里要注意:IP与端口不一致会导致阻塞,导致程序卡死
  11. local con = socket.connect(host, port)
  12. --如果是正常的IP地址,就会打印i,说明不阻塞
  13. print(i)
  14. --连接成功con不等于nil值,失败则等于nil
  15. if con then
  16. --con连接成功,才能发送字符串,\n代表数据结尾
  17. con:send("hello".."\n")
  18. --把con丢进去判断是否有接收到字符串数据,1为超时时间,结果返回table
  19. local recvt, sendt, status = socket.select({con}, nil, 1)
  20. if #recvt > 0 then
  21. --接收字符串
  22. local src = con:receive()
  23. print(src)
  24. end
  25. end
  26. end

关于socket里面的其他函数,想了解可以看文档

https://baijiahao.baidu.com/s?id=1611117152652243030&wfr=spider&for=pc
http://w3.impa.br/~diego/software/luasocket/socket.html#bind

  1. local socket = require("socket")
  2. local sleep = socket.sleep
  3. --延时0.5
  4. sleep(0.5)
  1. 打印socket输出
  2. newtry = function
  3. choose = function
  4. tcp6 = function
  5. source = function
  6. udp6 = function
  7. protect = function
  8. _SETSIZE = number
  9. _DATAGRAMSIZE = number
  10. BLOCKSIZE = number
  11. _SOCKETINVALID = number
  12. sourcet = table
  13. dns = table
  14. select = function
  15. udp = function
  16. sinkt = table
  17. tcp = function
  18. sink = function
  19. connect4 = function
  20. skip = function
  21. udp4 = function
  22. try = function
  23. tcp4 = function
  24. connect6 = function
  25. __unload = function
  26. _VERSION = string