网络编程
实现了一个简单的服务器/客户端通信demo
tcp/ip协议:网络层的ip协议和传输层的tcp协议
server
func f(c net.Conn){
defer c.Close()
for {
b := make([]byte, 1024)
n, err := c.Read(b) //阻塞等待输入
if err!=nil{
fmt.Println(err)
return
}
fmt.Println(string(b[:n]))
}
}
func main() {
l, err := net.Listen("tcp", "0.0.0.0:8888") //监听本地8888端口
if err != nil {
fmt.Println(err)
return
}
defer l.Close()
for {
c, err2 := l.Accept() //阻塞等待客户端连接
if err2 != nil {
fmt.Println(err)
return
}else{
fmt.Printf("客户端id:%v\n",c.RemoteAddr().String())
}
go f(c)
}
}
client
func main() {
c, err := net.Dial("tcp", "192.168.163.164:8888")
if err != nil {
fmt.Println(err)
return
}
defer c.Close()
w := bufio.NewReader(os.Stdin) //终端输入
for {
s, err2 := w.ReadString('\n')
if err2 != nil {
fmt.Println(err2)
return
}
s = strings.Trim(s, "\r\n")
if s == "exit"{
break
}
_, err3 := c.Write([]byte(s + "\n"))
if err3 != nil {
fmt.Println(err3)
return
}
}
}
json
序列化
前提:变量可导出(首字母大写)
json:"name":改json字符串的字段名
指针变量:编码时自动转换为它所指向的值 (当然,不传指针,Stu struct的成员Class如果换成Class struct类型,效果也是一模一样的。只不过指针更快,且能节省内存空间。)
type Stu struct {
Name string `json:"name"`
Age int
HIgh bool
sex string
Class *Class `json:"class"` //Class Class
}
type Class struct {
Name string
Grade int
}
func main() {
//实例化一个数据结构,用于生成json字符串
stu := Stu{
Name: "张三",
Age: 18,
HIgh: true,
sex: "男",
}
//指针变量
cla := new(Class) //cla := Class{}
cla.Name = "1班"
cla.Grade = 3
stu.Class=cla
jsonStu, err := json.Marshal(stu)
if err != nil {
fmt.Println("生成json字符串错误")
}
//jsonStu是[]byte类型,转化成string类型便于查看
fmt.Println(string(jsonStu))
}
//{"name":"张三","Age":18,"HIgh":true,"class":{"Name":"1班","Grade":3}}
反序列化
str := `{"name":"张三","Age":18,"HIgh":true,"class":{"Name":"1班","Grade":3}}`
var s Stu
json.Unmarshal([]byte(str), &s)
fmt.Printf("%+v %+v", s,*s.Class)
//{Name:张三 Age:18 HIgh:true sex: Class:0xc000008150} {Name:1班 Grade:3}
文件操作
读
NewReader
file, _ := os.Open("D:/t.txt")
defer file.Close()
reader := bufio.NewReader(file)
for {
str, err := reader.ReadString('\n')
if err == io.EOF {
// err 为 io.EOF 时,str 返回可能为 "",也可能非 ""
if len(str) != 0 {
fmt.Print(str)
}
break
}
fmt.Print(str)
}
写
NewWriter
file, _ := os.Create("D:/t.txt")
defer file.Close()
writer := bufio.NewWriter(file)
// 写字节切片到缓存
writer.Write([]byte{65, 66, 67})
// 写单个字节到缓存
writer.WriteByte('a')
// 写单个字符到缓存
writer.WriteRune('您')
// 写字符串到缓存
writer.WriteString("肥肠粉A")
// 将缓存数据刷新到底层的 io.Writer 对象
writer.Flush()
//ABCa您肥肠粉A