我想写一个聊天服务器。 使用编程语言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;
}
如何?如何修复bug? 我可以获得正确聊天服务器的示例吗? (只有Dlang) 另外,您能举例说明正确的客户。
答案 0 :(得分:0)
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建议的解决方案