博客搬家工具c/s实现方式
生活随笔
收集整理的這篇文章主要介紹了
博客搬家工具c/s实现方式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
博客搬家其實就是抓取數據,然后再提交數據,如果是自己辦的網站,比如說,sohu要把sina的博客搬過來,那就更加簡單了。
手動搬是很累的,全自動的處理方法則是,由用戶提交數據,然后,服務器程序等待事件觸發,然后跑完整個搬家過程。半自動的方法則有兩種,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;?}
進入接收數據模式
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();
客戶端發送就簡單了,最好用個線程
????????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;
????????}
操作密碼自然是讓指定的人用了,預先MD5下再發就好了。
手動搬是很累的,全自動的處理方法則是,由用戶提交數據,然后,服務器程序等待事件觸發,然后跑完整個搬家過程。半自動的方法則有兩種,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;?}
進入接收數據模式
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();
客戶端發送就簡單了,最好用個線程
????????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;
????????}
操作密碼自然是讓指定的人用了,預先MD5下再發就好了。
總結
以上是生活随笔為你收集整理的博客搬家工具c/s实现方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(1850)vue之电商管理系统
- 下一篇: 前端学习(2005)vue之电商管理系统