gpt4 book ai didi

multithreading - Dlang,Socket,聊天服务器

转载 作者:行者123 更新时间:2023-12-03 11:59:56 26 4
gpt4 key购买 nike

我想写一个聊天服务器。
使用编程语言D。(Dlang)
希望使用OOP。

我的例子。(不起作用)

import std.stdio;
import std.concurrency;
import core.thread;
import std.conv;
import std.socket;

synchronized class DataInfo{
shared this()
{
}
public shared Socket[] sockList;
shared void AddSocket(shared Socket scket)
{
sockList ~= scket;
}

shared(Socket[]) getSockList()
{
return to!(shared Socket[])(sockList);
}
}
void UserLoop(shared DataInfo data,shared(int) id)
{
Socket client;
synchronized(data)
{
client = cast(Socket)(data.sockList[id]);
}

while(true)
{
char[1024] buffer;
int sockCount = 0;
client.receive(buffer);
synchronized(data)
{
sockCount = data.sockList.length;
}

for(int i =0 ; i < sockCount; i++)
{
synchronized(data)
{
auto sk = cast( Socket)(data.sockList[i]);
sk.send("Hello world");
}
}
}
}

int main()
{

ushort port;
port = 4444;

auto listener = new TcpSocket();
assert(listener.isAlive);
listener.blocking = false;
listener.bind(new InternetAddress(port));
listener.listen(10);
writefln("Listening on port %d.", port);
shared(DataInfo) data = new shared(DataInfo);
while(true)
{
int len = 0;
auto client = cast(shared Socket)listener.accept();
synchronized(data)
{
data.AddSocket(client);
len = data.sockList.length;
}
spawn(&UserLoop,data,cast(shared int)len);
}
return 0;
}

如何?如何修复错误?
我可以举一个正确的聊天服务器的例子吗? (仅Dlang)
另外,您可以举一个正确客户端的例子吗?

最佳答案

import vibe.d;
import vibe.utils.array;

shared static this()
{
Chat m_chat=new Chat();
ushort port=5555;
listenTCP(port,&m_chat.connHandler,"127.0.0.1");
}
class Chat{
private:
TCPConnection[] connz;
public:
void connHandler(TCPConnection conn){
sendMessage(conn,"Hello!\n");
connz~=conn;
while(conn.connected){
while(conn.waitForData(dur!"seconds"(1L))){
ubyte[1] c;
string inMessage;
while(conn.dataAvailableForRead){
conn.read(c);
inMessage~=c;
}
foreach(TCPConnection _con; connz){
if(_con!=conn)
sendMessage(_con,"Someone says: "~inMessage);
}
}
}
connz.removeFromArray(conn);
}
void sendMessage(TCPConnection conn, string message){
conn.write(cast(ubyte[])message);
}
}

Lord_Evil建议的解决方案

关于multithreading - Dlang,Socket,聊天服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32467570/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com