• 博客搬家工具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下再发就好了。
  • 相关阅读:
    线段树模板(HDU 6356 Glad You Came)
    Treap模板
    Codeforces Round #499 (Div. 2) D. Rocket题解
    Codeforces Round #499 (Div. 2) C Fly题解
    KMP与AC自动机模板
    HDU 6351 Naive Operations(线段树)
    python核心编程第六章练习6-13
    python核心编程第六章练习6-12
    [转]我为什么要学习python
    python核心编程第六章练习6-11
  • 原文地址:https://www.cnblogs.com/birdshover/p/929182.html
Copyright © 2020-2023  润新知