仓颉编程语言-网络编程(TCP协议)

一、网络编程概述

        网络通信是两个设备通过计算机网络进行数据交换的过程。通过编写软件达成网络通信的行为即为网络编程。

二、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())
    }
}

结果:

注意:该示例是只能服务器发送一次消息,客户机发送一次消息,不能服务器连续发送消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值