Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Dlang、套接字、聊天服务器_Multithreading_Sockets_Oop_Chat_D - Fatal编程技术网

Multithreading Dlang、套接字、聊天服务器

Multithreading Dlang、套接字、聊天服务器,multithreading,sockets,oop,chat,d,Multithreading,Sockets,Oop,Chat,D,我想写一个聊天服务器。 使用编程语言D.(Dlang) 使用OOP是可取的 我的例子。(不起作用) 导入标准stdio; 导入标准并发; 导入core.thread; 进口标准conv; 进口标准插座; 同步类数据信息{ 共享此() { } 公共共享套接字[]套接字列表; 共享void AddSocket(共享套接字scket) { sockList~=scket; } 共享(套接字[])getSockList() { 返回到!(共享套接字[])(套接字列表); } } void UserLoo

我想写一个聊天服务器。 使用编程语言D.(Dlang) 使用OOP是可取的

我的例子。(不起作用)

导入标准stdio;
导入标准并发;
导入core.thread;
进口标准conv;
进口标准插座;
同步类数据信息{
共享此()
{
}
公共共享套接字[]套接字列表;
共享void AddSocket(共享套接字scket)
{
sockList~=scket;
}
共享(套接字[])getSockList()
{
返回到!(共享套接字[])(套接字列表);
}
}
void UserLoop(共享数据信息数据,共享(int)id)
{
套接字客户端;
已同步(数据)
{
client=cast(Socket)(data.sockList[id]);
}
while(true)
{
字符[1024]缓冲区;
int sockCount=0;
客户端接收(缓冲区);
已同步(数据)
{
sockCount=data.sockList.length;
}
对于(int i=0;i
怎么做?如何修复错误? 我可以得到一个正确的聊天服务器的例子吗?(只有德朗) 另外,你能举一个正确客户机的例子吗

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建议的解决方案

为什么要使用线程?与简单的解决方案(如只使用select())相比,它们要复杂得多,而且往往不值得,如果您需要更多并发套接字,甚至可以使用epoll和friends(尽管select对很多程序来说都足够好)。但是不管怎样,这个程序的长度是没有线程的一半,bug也会少一些。你可以看看我的这个老项目,当然可以进行一些优化,但是现在我没有其他的东西。并在这里将其用于一个简单的Web服务器,甚至这可能会有所帮助
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);
    }
}