1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

vlib/net: add buffered IO, x.net -> net (#6754)

This commit is contained in:
Emily Hudson
2020-11-15 20:54:47 +00:00
committed by GitHub
parent 20bec81678
commit cd2a2cef25
55 changed files with 741 additions and 1648 deletions

21
examples/buf_reader.v Normal file
View File

@@ -0,0 +1,21 @@
// Simple raw HTTP head request
import net
import time
import io
// Make a new connection
mut conn := net.dial_tcp('google.com:80')?
// Simple http HEAD request for a file
conn.write_str('GET /index.html HTTP/1.0\r\n\r\n')?
// Make sure to set a timeout so we can wait for a response!
conn.set_read_timeout(10 * time.second)
// Wrap in a buffered reader
mut r := io.new_buffered_reader(reader: io.make_reader(conn))
for {
l := r.read_line() or {
break
}
println('$l')
// Make it nice and obvious that we are doing this line by line
time.sleep_ms(10)
}

5
examples/net_peer_ip.v Normal file
View File

@@ -0,0 +1,5 @@
import net
conn := net.dial_tcp('google.com:80')?
peer_addr := conn.peer_addr()?
println('$peer_addr')

View File

@@ -1,14 +1,16 @@
// Simple raw HTTP head request
import x.net
import net
import time
import io
// Make a new connection
mut conn := net.dial_tcp('google.com:80')?
defer { conn.close() }
// Simple http HEAD request for a file
conn.write_string('HEAD /index.html HTTP/1.0\r\n\r\n')?
conn.write_str('HEAD /index.html HTTP/1.0\r\n\r\n')?
// Make sure to set a timeout so we can wait for a response!
conn.set_read_timeout(10 * time.second)
conn.set_read_timeout(net.infinite_timeout)
// Read all the data that is waiting
result := conn.read()?
result := io.read_all(conn)?
// Cast to string and print result
println(result.bytestr())
println(result.bytestr())

23
examples/net_t.v Normal file
View File

@@ -0,0 +1,23 @@
import net.http
import sync
import time
fn send_request(mut wg sync.WaitGroup) ?string {
start := time.ticks()
data := http.get('https://google.com')?
finish := time.ticks()
println('Finish getting time ${finish - start} ms')
wg.done()
return data.text
}
fn main() {
mut wg := sync.new_waitgroup()
for i := 0; i < 50; i++ {
wg.add(1)
go send_request(mut wg)
}
wg.wait()
}

View File

@@ -110,7 +110,7 @@ fn (image Image) save_as_ppm(file_name string) {
c_r := to_int(unsafe{image.data[i]}.x)
c_g := to_int(unsafe{image.data[i]}.y)
c_b := to_int(unsafe{image.data[i]}.z)
f_out.write('$c_r $c_g $c_b ')
f_out.write_str('$c_r $c_g $c_b ')
}
f_out.close()
}

View File

@@ -1,45 +0,0 @@
import net
// This file shows how a basic TCP echo server can be implemented using
// the `net` module. You can connect to the server by using netcat
// or telnet, in separate shells, for example:
// `nc 127.0.0.1 12345`
// `telnet 127.0.0.1 12345`
fn handle_connection(con net.Socket) {
peer_ip := con.peer_ip() or {
'0.0.0.0'
}
eprintln('${peer_ip:16} | new client connected')
defer {
eprintln('${peer_ip:16} | closing connection...')
con.close() or { }
}
con.send_string("Welcome to V's TCP Echo server.\n") or {
return
}
for {
line := con.read_line()
if line.len == 0 {
return
}
eprintln('${peer_ip:16} | received line: ' + line.trim_space())
con.send_string(line) or {
return
}
}
}
fn main() {
server_port := 12345
eprintln('Starting an echo server, listening on port: $server_port')
server := net.listen(server_port) or {
panic(err)
}
for {
con := server.accept() or {
server.close() or { }
panic(err)
}
go handle_connection(con)
}
}