手动搬是很累的,全自动的处理方法则是,由用户提交数据,然后,服务器程序等待事件触发,然后跑完整个搬家过程。半自动的方法则有两种,1,数据抓取到客户端,而后上传给服务器;2,有客户端控制,在服务器实行抓取。
全自动还不错,不过,一般来说搬家工具不是万能的,比如能抓sina的,未必能抓163的。因此,我个人认为还是有客户端控制,在服务器实行抓取最不错。
客户端设计来说,非常简单。要涉及,要搬家的博客网站,和在现在博客网站的用户,还有文章搬到现在网站的哪个分类。有些网站读取分页很麻烦,可以直接指定。
服务端,随便跑个dos窗口程序就行了。
首先设计一套简单的协议,比如
传输数据要求以 blogIntro开头,以blogend结尾,例如:blogIntro000000xizhen/partent/xizhen/sorts/0/0blogend
000000的地方放置包的长度,后面依次就是表单的信息,不用加密了,不过为了避免出现问题,数据最好url编码一下,就不会和分隔符'/'冲突了。
服务端监听,比如80000端口
TcpListener listener = null;
try
{
if (server.ipadd == null)
listener = new TcpListener(server.port); //server.port就是8000端口啦
else
listener = new TcpListener(server.ipadd, server.port);
listener.Start();
}
catch (Exception e) { Console.WriteLine(e.Message); Console.Read(); return; }
try
{
if (server.ipadd == null)
listener = new TcpListener(server.port); //server.port就是8000端口啦
else
listener = new TcpListener(server.ipadd, server.port);
listener.Start();
}
catch (Exception e) { Console.WriteLine(e.Message); Console.Read(); return; }
进入接收数据模式
while (true)
{
Console.WriteLine("\n等待连接");
TcpClient client = listener.AcceptTcpClient();
Console.WriteLine("成功建立连接.");
//给客户端回点信息
string buff = "成功建立连接\r\n";
byte[] b = System.Text.Encoding.Default.GetBytes(buff);
client.Client.Send(b);
NetworkStream myNetworkStream = client.GetStream();
byte[] bytes = new byte[1024];
int bytesRead = myNetworkStream.Read(bytes, 0, bytes.Length);
string getstr = Encoding.Default.GetString(bytes, 0, bytesRead);
Console.WriteLine("收到数据:\n\n" + getstr);
string buff1 = "成功接收数据\r\n";
byte[] b1 = System.Text.Encoding.Default.GetBytes(buff1);
client.Client.Send(b1);
//收到数据下面就是做点事情了,怎么做,就要自己定义了。我想抓不通的博客,用个反射比较好
}
listener.Stop();
{
Console.WriteLine("\n等待连接");
TcpClient client = listener.AcceptTcpClient();
Console.WriteLine("成功建立连接.");
//给客户端回点信息
string buff = "成功建立连接\r\n";
byte[] b = System.Text.Encoding.Default.GetBytes(buff);
client.Client.Send(b);
NetworkStream myNetworkStream = client.GetStream();
byte[] bytes = new byte[1024];
int bytesRead = myNetworkStream.Read(bytes, 0, bytes.Length);
string getstr = Encoding.Default.GetString(bytes, 0, bytesRead);
Console.WriteLine("收到数据:\n\n" + getstr);
string buff1 = "成功接收数据\r\n";
byte[] b1 = System.Text.Encoding.Default.GetBytes(buff1);
client.Client.Send(b1);
//收到数据下面就是做点事情了,怎么做,就要自己定义了。我想抓不通的博客,用个反射比较好
}
listener.Stop();
客户端发送就简单了,最好用个线程
void SCAction()
{
Socket sc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
Modules.ServerSet server = ReadConfig.getServer();
try
{
sc.Connect(server.ipadd, server.port);
int bytesRec = sc.Receive(bytes);
string resstr = Encoding.Default.GetString(bytes, 0, bytesRec);
q.Enqueue(resstr);
if (resstr.IndexOf("<success>") > -1)
bt1Stat = false;
}
catch
{
q.Enqueue("无法连接远程服务器,很可能是由于服务端软件未启动引起");
sc.Close();
return;
}
string buff = msg;
byte[] b = System.Text.Encoding.Default.GetBytes(buff);
sc.Send(b);
while (sc.Connected)
{
if (systemClose)
break;
try
{
int bytesRec = sc.Receive(bytes);
string resstr = Encoding.Default.GetString(bytes, 0, bytesRec);
q.Enqueue(resstr);
if (resstr.IndexOf("<eof>") > -1)
{
q.Enqueue("****************************************************\r\n");
break;
}
}
catch { break; }
}
sc.Close();
bt1Stat = true;
}
{
Socket sc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
Modules.ServerSet server = ReadConfig.getServer();
try
{
sc.Connect(server.ipadd, server.port);
int bytesRec = sc.Receive(bytes);
string resstr = Encoding.Default.GetString(bytes, 0, bytesRec);
q.Enqueue(resstr);
if (resstr.IndexOf("<success>") > -1)
bt1Stat = false;
}
catch
{
q.Enqueue("无法连接远程服务器,很可能是由于服务端软件未启动引起");
sc.Close();
return;
}
string buff = msg;
byte[] b = System.Text.Encoding.Default.GetBytes(buff);
sc.Send(b);
while (sc.Connected)
{
if (systemClose)
break;
try
{
int bytesRec = sc.Receive(bytes);
string resstr = Encoding.Default.GetString(bytes, 0, bytesRec);
q.Enqueue(resstr);
if (resstr.IndexOf("<eof>") > -1)
{
q.Enqueue("****************************************************\r\n");
break;
}
}
catch { break; }
}
sc.Close();
bt1Stat = true;
}
操作密码自然是让指定的人用了,预先MD5下再发就好了。