1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "io"
  6. "net"
  7. "os"
  8. "strconv"
  9. "strings"
  10. )
  11. //写函数和读函数同server端,要保持一致
  12. func write(conn net.Conn, txt string) error {
  13. length := len(txt)
  14. _, err := conn.Write([]byte(fmt.Sprintf("%05d", length)))
  15. if err != nil {
  16. fmt.Println(err)
  17. return err
  18. }
  19. _, err = conn.Write([]byte(txt))
  20. if err != nil {
  21. fmt.Println(err)
  22. return err
  23. }
  24. return nil
  25. }
  26. //写函数和读函数同server端,要保持一致
  27. func read(conn net.Conn) (string, error) {
  28. lengthBytes := make([]byte, 5)
  29. _, err := conn.Read(lengthBytes)
  30. if err != nil {
  31. fmt.Println(err)
  32. return "", err
  33. }
  34. length, err := strconv.Atoi(string(lengthBytes))
  35. if err != nil {
  36. fmt.Println(err)
  37. return "", err
  38. }
  39. ctx := make([]byte, length)
  40. _, err = conn.Read(ctx)
  41. if err != nil {
  42. fmt.Println(err)
  43. return "", err
  44. }
  45. return string(ctx), nil
  46. }
  47. func input(prompt string) string {
  48. fmt.Print(prompt)
  49. scanner := bufio.NewScanner(os.Stdin)
  50. scanner.Scan()
  51. return strings.TrimSpace(scanner.Text())
  52. }
  53. func main() {
  54. addr := "127.0.0.1:8888"
  55. protocol := "tcp"
  56. // 1. 创建连接
  57. conn, err := net.Dial(protocol, addr)
  58. if err != nil {
  59. fmt.Println(err)
  60. return
  61. }
  62. // 2. 交换数据
  63. for {
  64. txt := input("请输入信息:")
  65. if txt == "exit" {
  66. break
  67. }
  68. err := write(conn, txt)
  69. if err != nil {
  70. if err != io.EOF {
  71. fmt.Println(err)
  72. }
  73. break
  74. }
  75. txt, err = read(conn)
  76. if err != nil {
  77. if err != io.EOF {
  78. fmt.Println(err)
  79. }
  80. break
  81. }
  82. fmt.Printf("服务器端响应: %s\n", txt)
  83. }
  84. // conn.Read()
  85. // 3. 关闭
  86. conn.Close()
  87. }
文档更新时间: 2021-08-25 17:01   作者:张尚