博客搬家工具c/s实现方式

博客搬家其实就是抓取数据,然后再提交数据,如果是自己办的网站,比如说,sohu要把sina的博客搬过来,那就更加简单了。

手动搬是很累的,全自动的处理方法则是,由用户提交数据,然后,服务器程序等待事件触发,然后跑完整个搬家过程。半自动的方法则有两种,1,数据抓取到客户端,而后上传给服务器;2,有客户端控制,在服务器实行抓取。

全自动还不错,不过,一般来说搬家工具不是万能的,比如能抓sina的,未必能抓163的。因此,我个人认为还是有客户端控制,在服务器实行抓取最不错。

客户端设计来说,非常简单。要涉及,要搬家的博客网站,和在现在博客网站的用户,还有文章搬到现在网站的哪个分类。有些网站读取分页很麻烦,可以直接指定。
clint.gif

服务端,随便跑个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;
        }


server.gif


server2.gif

操作密码自然是让指定的人用了,预先MD5下再发就好了。
posted @ 2007-10-18 15:50  Birdshover  阅读(1823)  评论(0编辑  收藏  举报