跟我一起学“仓颉”编程语言-聊天室

本案例来自《图解仓颉编程-高级篇》书5-15和5-16的代码。代码地址:仓颉编程快速上手-刘玥_张荣超

一、聊天室服务端

package Study
import std.net.*
import std.collection.*
 
//存储所有在线客户端
let onlineClients = ArrayList<TcpSocket>()
 
/*
* 接收消息并将该消息转发给所有在线的客户端
*/
func receiveMessage(client: TcpSocket) {
    let socketAddress = client.remoteAddress.toString()
    let messageHead = socketAddress.toString() + "#"
    let onlineMessage = messageHead + "上线了!"
    sendMessage(onlineMessage.toArray())
    let buffer = Array<Byte>(1024, repeat: 0)
    var len: Int64
    while (true) {
        len = client.read(buffer)
        if (len == 0) {
            // 从onlineClients中移除client
            onlineClients.removeIf {socket: TcpSocket => socket == client}
            client.close()  // 关闭client
            let offlineMessage = messageHead + "下线了!"
            sendMessage(offlineMessage.toArray())
            break
        }
        let messageToSend = messageHead + String.fromUtf8(buffer[0..len])
        sendMessage(messageToSend.toArray())
    }
}
 
/*
* 发送消息
*/
func sendMessage(buffer: Array<Byte>) {
    for (clinetSocket in onlineClients) {
        clinetSocket.write(buffer)
    }
}
 
/*
* 服务端启动
*/
func start() {
    try (
        server = TcpServerSocket(bindAt: 9999)
    ) {
        server.bind()
        println("服务端已启动!")
        while (true) {  // 与多个客户端连接
            let client = server.accept()
            onlineClients.add(client)
            spawn {
                receiveMessage(client)
            }
        }
    }
}
 
main() {
    start()
}

二、聊天室客户端

package Sender
import std.net.*
import std.env.*

// 发送消息
func sendMessage(client: TcpSocket) {
    while (true) {
        let optMessage = getStdIn().readln()
        if (let Some(message) <- optMessage) {
            if (message == "N" || message == "n") {
                client.close()
                break
            }
            client.write(message.toArray())
        } else {
            println("非法输入")
        }
    }
}

// 接收消息
func receiveMessage(client: TcpSocket) {
    let buffer = Array<UInt8>(1024, repeat: 0)
    while (true) {
        try {
            let len = client.read(buffer)
            let message = String.fromUtf8(buffer[0..len])
            let array = message.split("#", 2)
            let socketAddress = array[0]
            let messageBody = array[1]
            if (socketAddress == client.localAddress.toString()) {
                println("我: ${messageBody}")
            } else {
                println("${socketAddress}: ${messageBody}")
            }
        } catch (e: SocketException) {
            println("我下线了!")
            break
        }
    }
}

// 客户端启动
func start() {
    let client = TcpSocket("127.0.0.1", 9999)
    client.connect()
    println("客户端: ${client.localAddress}已启动!")

    let send = spawn {
        sendMessage(client)
    }

    let receive = spawn {
        receiveMessage(client)
    }

    send.get()
    receive.get()
}

main() {
    start()
}

三、小结

本章为大家详细的介绍了仓颉编程语言中聊天室的内容,下一章,为大家带来反射和注解的内容。最后,创作不易,如果大家觉得我的文章对学习仓颉服务端开发有帮助的话,就动动小手,点个免费的赞吧!收到的赞越多,我的创作动力也会越大哦,谢谢大家🌹🌹🌹!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学徒钝子生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值