|
using System; using System.Text; using System.Net; using System.IO; using System.Net.Sockets; using System.Collections; using System.Diagnostics;
namespace NntpTools { /// <summary> /// Class1 的摘要说明。 /// </summary> class Debug { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main(string[] args) { NNTPClass nc=new NNTPClass(); nc.Connect("msnews.microsoft.com"); ArrayList grouplist=nc.GetNewsgroups(); for(int i=0;i<grouplist.Count;i++){ Console.WriteLine(grouplist[i].ToString()); } ArrayList cardlist=nc.GetNews("microsoft.public.cn.dotnet.framework"); Console.WriteLine("============================================================="); StreamWriter sw=File.CreateText("c:\\news.txt"); for(int i=0;i<cardlist.Count;i++){ Console.WriteLine(cardlist[i].ToString()); sw.WriteLine(cardlist[i].ToString()); sw.WriteLine("============================================================="); } sw.Flush(); sw.Close(); nc.Disconnect(); Console.ReadLine(); } }
class NNTPClass:System.Net.Sockets.TcpClient{ public void Connect(string server){ string response;
Connect(server, 119);
response = Response();
if (response.Substring( 0, 3) != "200") {
throw new Exception(response);
}
}
public void Disconnect() {
string message;
string response;
message = "QUIT\r\n";
Write(message);
response = Response();
if (response.Substring( 0, 3) != "205") {
throw new Exception(response);
}
} public ArrayList GetNewsgroups() {
string message;
string response;
ArrayList retval = new ArrayList();
message = "LIST\r\n";
Write(message);
response = Response();
if (response.Substring( 0, 3) != "215") {
throw new Exception(response);
}
while (true) {
response = Response();
if (response == ".\r\n"
response == ".\n") {
return retval;
}
else {
char[] seps = { ' ' };
string[] values = response.Split(seps);
retval.Add(values[0]);
continue;
}
}
} public void Post(string newsgroup, string subject, string from,
string content) {
string message;
string response;
message = "POST " + newsgroup + "\r\n";
Write(message);
response = Response();
if (response.Substring( 0, 3) != "340") {
throw new Exception(response);
}
message = "From: " + from + "\r\n"
+ "Newsgroups: " + newsgroup + "\r\n"
+ "Subject: " + subject + "\r\n\r\n"
+ content + "\r\n.\r\n";
Write(message);
response = Response();
if (response.Substring( 0, 3) != "240") {
throw new Exception(response);
}
}
public ArrayList GetNews(string newsgroup) {
string message;
string response;
ArrayList retval = new ArrayList();
message = "GROUP " + newsgroup + "\r\n";
Write(message);
response = Response();
if (response.Substring( 0, 3) != "211") {
throw new Exception(response);
}
char[] seps = { ' ' };
string[] values = response.Split(seps);
long start = Int32.Parse(values[2]);
long end = Int32.Parse(values[3]);
if (start+100 < end && end > 100) {
start = end-100;
}
for (long i=start;i<end;i++) {
message = "ARTICLE " + i + "\r\n";
Write(message);
response = Response();
if (response.Substring( 0, 3) == "423") {
continue;
}
if (response.Substring( 0, 3) != "220") {
throw new Exception(response);
}
string article = "";
while (true) {
response = Response();
if (response == ".\r\n") {
break;
}
if (response == ".\n") {
break;
}
if (article.Length < 1024) {
article += response;
};
}
retval.Add(article);
}
return retval;
}
private string Response() {
//System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); System.Text.Encoding enc=Encoding.Default; byte []serverbuff = new Byte[1024];
NetworkStream stream = GetStream();
int count = 0;
while (true) {
byte []buff = new Byte[2];
int bytes = stream.Read( buff, 0, 1 );
if (bytes == 1) {
serverbuff[count] = buff[0];
count++;
if (buff[0] == '\n') {
break;
}
}
else {
break;
};
};
string retval = enc.GetString( serverbuff, 0, count );
System.Diagnostics.Debug.WriteLine("READ:" + retval);
return retval;
}
private void Write(string message) {
System.Text.ASCIIEncoding en = new System.Text.ASCIIEncoding() ;
byte[] WriteBuffer = new byte[1024] ;
WriteBuffer = en.GetBytes(message) ;
NetworkStream stream = GetStream() ;
stream.Write(WriteBuffer,0,WriteBuffer.Length);
System.Diagnostics.Debug.WriteLine("WRITE:" + message); }
}
} }
|