Multithreading Dlang、套接字、聊天服务器
我想写一个聊天服务器。 使用编程语言D.(Dlang) 使用OOP是可取的 我的例子。(不起作用)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
导入标准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);
}
}