五月五号日报
今日学习内容
1Web服务器
开发一个处理一个HTTP请求的Web服务器。Web服务器应该接受并解析HTTP请求,然后从服务器的文件系统获取所请求的文件,创建一个由响应文件组成的HTTP响应消息,前面是首部行,然后将响应直接发送给客户端。如果请求的文件不存在于服务器中,则服务器应该向客户端发送“404 Not Found”差错报文。
from socket import *
serverSocket = socket(AF_INET,SOCK_STREAM)#创建TCP套接字
serverSocket.bind(('',6789))
serverSocket.listen(1)#最大连接数为1
while True:
print("准备提供服务")
connectionSocket,addr=serverSocket.accept() # 接收到客户连接请求后,建立新的TCP连接套接字
try:
message=connectionSocket.recv(1024)#获取客户发送的报文,1024为缓冲区大小
filename=message.split()[1]#获得URI,去掉首部'/'就是文件名
f=open(filename[1:])
outputdata=f.read()
header = ' HTTP/1.1 200 OK\nConnection: close\nContent-Type: text/html\nContent-Length: %d\n\n' % (
len(outputdata))
connectionSocket.send(header.encode())
for i in range(0,len(outputdata)):
connectionSocket.send(outputdata[i].encode())#把文件各行数据塞到response中
connectionSocket.close()#关闭数据连接
except IOError:
header=' HTTP/1.1 404 Found'
connectionSocket.send(header.encode())
connectionSocket.close()
serverSocket.close()
效果如下
2Go语言中的包(Package)
比如fmt
,os
等这样具有常用功能的内置包在 Go 语言中有 150 个以上,它们被称为标准库,大部分(一些底层的除外)内置于 Go 本身。
2.1regexp
包
package main
import (
"fmt"
"regexp"
"strconv"
)
func main() {
searchIn := "John: 2578.34 William: 4567.23 Steve: 5632.18"
pat := "[0-9]+.[0-9]+" //正则
f := func(s string) string {
v, _ := strconv.ParseFloat(s, 32)
return strconv.FormatFloat(v*2, 'f', 2, 32)
}
if ok, _ := regexp.Match(pat, []byte(searchIn)); ok {
fmt.Println("Not found!")
}
re, _ := regexp.Compile(pat)
//将匹配到的部分替换为"##.#"
str := re.ReplaceAllString(searchIn, "##.##")
fmt.Println(str)
//参数为函数时
str2 := re.ReplaceAllStringFunc(searchIn, f)
fmt.Println(str2)
}
2.2锁和sync
包
在一些复杂的程序中,通常通过不同线程执行不同应用来实现程序的并发。当不同线程要使用同一个变量时,经常会出现一个问题:无法预知变量被不同线程修改的顺序!经典的做法是一次只能让一个线程对共享变量进行操作。当变量被一个线程改变时(临界区),我们为它上锁,直到这个线程执行完成并解锁后,其他线程才能访问它。
2.3自定义包和可见性:
当写自己包的时候,要使用短小的不含有 _
(下划线)的小写单词来为文件命名。这里有个简单例子来说明包是如何相互调用以及可见性是如何实现的。
package main
import (
"fmt"
"foo"
)
func main() {
var test1 string
test1 = bar.ReturnStr()
fmt.Printf("ReturnStr from package1: %s\n", test1)
fmt.Printf("Integer from package1: %d\n", bar.Pack1Int)
}
package bar
var Pack1Int int = 42
var PackFloat = 3.14
func ReturnStr() string {
return "Hello main!"
}
3Linux磁盘与文件系统管理
系统管理员重要任务之一就是管理好自己的磁盘文件系统,每个分区槽不可太大也不能太小,太大会造成磁盘容量浪费,太小会产生文件无法存储问题。