1. 程式人生 > >tcp編程、socket編程

tcp編程、socket編程

open image udp編程 pen ... new pan fun 終端

tcp編程(需要建立連接,三次握手,四次揮手,然後發送信息流,數據包是有序的)

udp編程(知道IP、端口直接發送數據,數據包可能是無序的)

1、客戶端和服務器

技術分享圖片

socket編程

1.服務端的處理流程
  a.監聽端口
  b.接收客戶端的鏈接
  c.創建goroutine,處理該鏈接

2.客戶端的處理流程
  a.建立與服務端的鏈接
  b.進行數據收發
  c.關閉鏈接

3.服務端代碼

技術分享圖片
package main

import (
    "fmt"
    "net"//導入socket的包
)

func main() {
    fmt.Println("start server...")
    listen, err :
= net.Listen("tcp", "0.0.0.0:50000")//監聽50000端口 if err != nil { fmt.Println("listen failed, err:", err) return } for { conn, err := listen.Accept()//等待客戶端連接 if err != nil { fmt.Println("accept failed, err:", err) continue } go process(conn) } } func process(conn net.Conn) { defer conn.Close()
for { buf := make([]byte, 512) _, err := conn.Read(buf)//讀取客戶端傳輸過來的數據 if err != nil { fmt.Println("read err:", err) return } fmt.Println("read: ", string(buf)) } }
View Code

4.客戶端代碼

技術分享圖片
package main

import (
    "bufio"
    "fmt"
    "
net" "os" "strings" ) func main() { conn, err := net.Dial("tcp", "localhost:50000") //建立鏈接 if err != nil { fmt.Println("Error dialing", err.Error()) return } defer conn.Close() inputReader := bufio.NewReader(os.Stdin) //從終端讀取數據 for { input, _ := inputReader.ReadString(\n) //從終端讀取一行數據 trimmedInput := strings.Trim(input, "\r\n")//去掉字符串\r\n if trimmedInput == "Q" { return } _, err = conn.Write([]byte(trimmedInput))//將信息發給服務端 if err != nil { return } } }
View Code

tcp編程、socket編程