Advertisement
arekkusu6

tcp server/client

Mar 25th, 2025
411
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 2.44 KB | Source Code | 0 0
  1. //server
  2. package main
  3.  
  4. import (
  5.     "encoding/json"
  6.     "fmt"
  7.     "log"
  8.     "net"
  9.     "sync"
  10. )
  11.  
  12.  
  13. type Datas struct {
  14.     ID      string      `json:"id"`
  15.     Text    string      `json:"text"`
  16. }
  17.  
  18.  
  19. var (
  20.     clients = make(map[net.Conn]string)
  21.     mu sync.Mutex
  22. )
  23.  
  24.  
  25. func handleConnection(conn net.Conn, id string) {
  26.     defer func()  {
  27.         conn.Close()
  28.         mu.Lock()
  29.         delete(clients, conn)
  30.         mu.Unlock()
  31.     }()
  32.  
  33.  
  34.     for {
  35.         var dec = json.NewDecoder(conn)
  36.  
  37.         var datas Datas
  38.  
  39.         if err := dec.Decode(&datas); err != nil {
  40.             return
  41.         }
  42.  
  43.         fmt.Println(datas)
  44.  
  45.         mu.Lock()
  46.         for client, roomID := range clients {
  47.             if roomID == id && client != conn {
  48.                 if err := json.NewEncoder(client).Encode(&datas); err != nil {
  49.                     log.Println(err)
  50.                     return
  51.                 }
  52.             }
  53.         }
  54.         mu.Unlock()
  55.     }
  56. }
  57.  
  58.  
  59. func startServer() {
  60.     addr, err := net.ResolveTCPAddr("tcp", ":8000")
  61.  
  62.     if err != nil {
  63.         log.Println(err)
  64.         return
  65.     }
  66.  
  67.     ln, err := net.ListenTCP("tcp", addr)
  68.  
  69.     if err != nil {
  70.         log.Println(err)
  71.         return
  72.     }
  73.  
  74.     defer ln.Close()
  75.  
  76.     for {
  77.         conn, err := ln.Accept()
  78.  
  79.         if err != nil {
  80.             log.Println(err)
  81.             return
  82.         }
  83.  
  84.         var idB = make([]byte, 1024)
  85.  
  86.         n, err := conn.Read(idB)
  87.  
  88.         if err != nil {
  89.             log.Println(err)
  90.             return
  91.         }
  92.  
  93.         var id = string(idB[:n])
  94.  
  95.         mu.Lock()
  96.         clients[conn] = id
  97.         mu.Unlock()
  98.  
  99.         fmt.Println(clients)
  100.  
  101.         go handleConnection(conn, id)
  102.     }
  103. }
  104.  
  105. //client
  106. package main
  107.  
  108. import (
  109.     "encoding/json"
  110.     "fmt"
  111.     "log"
  112.     "net"
  113. )
  114.  
  115.  
  116. func read(conn net.Conn) {
  117.     for {
  118.         var received Datas
  119.  
  120.         var dec = json.NewDecoder(conn)
  121.  
  122.         if err := dec.Decode(&received); err != nil {
  123.             log.Println(err)
  124.             return
  125.         }
  126.  
  127.         fmt.Println(received.Text)
  128.     }
  129. }
  130.  
  131.  
  132. func write(conn net.Conn, id string, username string) {
  133.     for {
  134.         var text string
  135.  
  136.         if _, err := fmt.Scanln(&text); err != nil {
  137.             log.Println(err)
  138.             return
  139.         }
  140.    
  141.         var datas = Datas{
  142.             ID: id,
  143.             Text: fmt.Sprintf("%s said %q", username, text),
  144.         }
  145.    
  146.         var enc = json.NewEncoder(conn)
  147.    
  148.         if err := enc.Encode(&datas); err != nil {
  149.             log.Println(err)
  150.             return
  151.         }
  152.     }
  153. }
  154.  
  155.  
  156. func startClient(id string, username string) {
  157.     conn, err := net.Dial("tcp", "localhost:8000")
  158.  
  159.     if err != nil {
  160.         log.Println(err)
  161.         return
  162.     }
  163.  
  164.     if _, err := conn.Write([]byte(id)); err != nil {
  165.         log.Println(err)
  166.         return
  167.     }
  168.  
  169.     go read(conn)
  170.     go write(conn, id, username)
  171.  
  172.     select {}
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement