一、网络编程概述
网络通信是两个设备通过计算机网络进行数据交换的过程。通过编写软件达成网络通信的行为即为网络编程。
二、TCP协议概述
TCP是Internet的TCP/IP协议家族中最重要的协议之一,TCP协议具有如下特点:
(1)TCP是面向连接的,在通信之前必须双方必须建议建立TCP连接。
(2)TCP提供可靠服务,TCP协议可以保证传输的数据按发送顺序到达,且不出差错、不丢失、不重复。
(3)TCP只能进行点到点的通信。
(4)TCP是面向字节流的,发送方的TCP将应用程序交下来的数据视为无结构的字节流,并且分割成TCP报文段进行传输,在接受方向应用程序递交的也是字节流。
三、仓颉中使用TCP协议进行网络编程
1.服务器端
首先要进行基于TCP/IP协议的网络编程,需要导入包,import std.net.*。通过创建TcpServerSocket()对象来进行连接。
import std.net.*
public func startServer()
{
println("服务器正在启动..")
let serverSocket = TcpServerSocket(bindAt: 8900)
serverSocket.bind()
let socket = serverSocket.accept()
println("服务器与客户端建立了连接")
}
2.客户机端
同服务器端需要导入包:import std.net.*。通过创建TcpSocket()对象来连接。
import std.net.*
public func startClient()
{
let client = TcpSocket("127.0.0.1", 8900)
client.connect()
println("客户端与服务器连接成功")
}
运行结果为:
注意:服务器端和客户机端的端口号需要一致。
3.服务器和客户机接收和发送消息
发送消息:通过控制台从键盘输入,然后再通过write()方法发送信息。仓颉从键盘输入需要导入包:import std.env.*(最新的仓颉1.0.0版本),var message = getStdIn().readln()。该输入后message是Option类型,再通过getOrThrow()方法解析。
接收消息:通过创建一个字节数组,再通过read()方法读取后再解析成字符串。
服务器端:
import std.env.*
import std.net.*
public func startServer()
{
println("服务器正在启动..")
let serverSocket = TcpServerSocket(bindAt: 8900)
serverSocket.bind()
let socket = serverSocket.accept()
println("服务器与客户端建立了连接")
//服务器向客户端发送消息
var msgOption = getStdIn().readln()
var sendMsg = msgOption.getOrThrow()
socket.write(sendMsg.toArray())
//服务器接受客户端的消息
let buffer = Array<Byte>(1024,repeat:0)
var len = socket.read(buffer)
var message = String.fromUtf8(buffer[0..len])
println("服务器接收到的消息为:${message}")
}
客户机端:
import std.net.*
import std.env.*
public func startClient()
{
let client = TcpSocket("127.0.0.1", 8900)
client.connect()
println("客户端与服务器连接成功")
//客户机接收服务器消息
let buffer = Array<Byte>(1024,repeat:0)
let len = client.read(buffer)
var message = String.fromUtf8(buffer[0..len])
println("客户机接收服务器消息为:${message}")
//客户机向服务器发送消息
var msgOption = getStdIn().readln()
var msg = msgOption.getOrThrow()
client.write(msg.toArray())
}
结果为:
注意:上述示例需要服务器和客户端发送消息和接收消息相反,如服务器先发送消息后接收消息,客户机先接收消息后发送消息,并且双方各发送和接收消息一次程序就会结束。
加上一个死循环就可以不限发送消息:
服务器端:
import std.env.*
import std.net.*
public func startServer()
{
println("服务器正在启动..")
let serverSocket = TcpServerSocket(bindAt: 8900)
serverSocket.bind()
let socket = serverSocket.accept()
println("服务器与客户端建立了连接")
while(true)
{
//服务器向客户端发送消息
var msgOption = getStdIn().readln()
var sendMsg = msgOption.getOrThrow()
socket.write(sendMsg.toArray())
//服务器接受客户端的消息
let buffer = Array<Byte>(1024,repeat:0)
var len = socket.read(buffer)
var message = String.fromUtf8(buffer[0..len])
println("服务器接收到的消息为:${message}")
}
}
客户机端:
import std.net.*
import std.env.*
public func startClient()
{
let client = TcpSocket("127.0.0.1", 8900)
client.connect()
println("客户端与服务器连接成功")
while(true)
{
//客户机接收服务器消息
let buffer = Array<Byte>(1024,repeat:0)
let len = client.read(buffer)
var message = String.fromUtf8(buffer[0..len])
println("客户机接收服务器消息为:${message}")
//客户机向服务器发送消息
var msgOption = getStdIn().readln()
var msg = msgOption.getOrThrow()
client.write(msg.toArray())
}
}
结果:
注意:该示例是只能服务器发送一次消息,客户机发送一次消息,不能服务器连续发送消息。