我正在写一个irc bot,所以我建立了一个连接服务器和频道的客户端。然后我需要一个身份服务器,所以我做了,然后将其调用到我的客户端。问题是,当我将我的Ident方法调用到我的客户端时,程序只是坐在那里,黑屏。我知道我可以使用irc库轻松完成这项工作,但我想用套接字来完成。
namespace TCPClient
{
class IdentServer
{
int serverPort = 113;
TcpListener listener = null;
TcpClient client = null;
public void Ident(string User)
{
listener = new TcpListener(IPAddress.Any, serverPort);
listener.Start();
string infoSent = "USER:UNIX:" + User;
byte[] readBuf = new byte[600];
//byte[] writeBuf = Encoding.ASCII.GetBytes(infoSent);
for (; ; )
{
TcpClient client = null;
NetworkStream netStream = null;
client = listener.AcceptTcpClient();
byte[] writeBuf = Encoding.ASCII.GetBytes(infoSent);
netStream = client.GetStream();
netStream.Write(writeBuf, 0, writeBuf.Length);
int rece = netStream.Read(readBuf, 0, readBuf.Length);
Array.Resize(ref readBuf, rece);
Console.WriteLine(Encoding.ASCII.GetString(readBuf));
netStream.Close();
client.Close();
}
}
}
}
这是客户端
namespace TCPClient
{
class Program
{
static void Main(string[] args)
{
Thread t;
byte[] Buffer = new byte[3000];
TcpClient client = null;
string user= "ABOT1";
string nick ="NICK ABOT1";
string channel = "JOIN #Chataholics";
client = new TcpClient("asimov.freenode.net", 6667);
IdentServer ident = new IdentServer();
NetworkStream netStream = client.GetStream();
byte[] nameBuff = Encoding.ASCII.GetBytes(nick);
netStream.Write(nameBuff, 0, nameBuff.Length);
byte[] channelBuf = Encoding.ASCII.GetBytes(channel);
netStream.Write(channelBuf, 0, channelBuf.Length);
ident.Ident(user);
for (; ; )
{
int rec = netStream.Read(Buffer, 0, Buffer.Length);
Array.Resize(ref Buffer, rec);
Console.Write(Encoding.ASCII.GetString(Buffer));
}
}
}
}
答案 0 :(得分:1)
你在“Ident”-Code中有一个无限的for循环。你确定它退出了循环吗?如果它是无限的,你的代码将永远不会到达第二个for循环。
在客户端代码中的“ident.Ident(user)”行中放置一个断点并逐步执行。
编辑:您的代码似乎总体上是错误的。你的代码挂起了
client = listener.AcceptTcpClient();
在您的Ident服务器内。监听器正在等待客户端连接,但这种情况从未发生过,因此应用程序会等待,并且您将看到黑屏。
以下是我与IRC服务器的连接方式:
使用线程
使用Stream(Streamreader / Streamwriter),TCPClient 很好地支持。
确保根据RFC回复“PING”消息,否则您将断开连接。