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);
}
}
}
}