博客搬家工具c/s实现方式
2007-10-18 15:50
197 查看
博客搬家其实就是抓取数据,然后再提交数据,如果是自己办的网站,比如说,sohu要把sina的博客搬过来,那就更加简单了。
手动搬是很累的,全自动的处理方法则是,由用户提交数据,然后,服务器程序等待事件触发,然后跑完整个搬家过程。半自动的方法则有两种,1,数据抓取到客户端,而后上传给服务器;2,有客户端控制,在服务器实行抓取。
全自动还不错,不过,一般来说搬家工具不是万能的,比如能抓sina的,未必能抓163的。因此,我个人认为还是有客户端控制,在服务器实行抓取最不错。
客户端设计来说,非常简单。要涉及,要搬家的博客网站,和在现在博客网站的用户,还有文章搬到现在网站的哪个分类。有些网站读取分页很麻烦,可以直接指定。
![](http://images.cnblogs.com/cnblogs_com/birdshover/catch/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等待连接
![](http://www.cnblogs.com/Images/dot.gif)
");
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;
}
![](http://images.cnblogs.com/cnblogs_com/birdshover/catch/server.gif)
![](http://images.cnblogs.com/cnblogs_com/birdshover/catch/server2.gif)
操作密码自然是让指定的人用了,预先MD5下再发就好了。
手动搬是很累的,全自动的处理方法则是,由用户提交数据,然后,服务器程序等待事件触发,然后跑完整个搬家过程。半自动的方法则有两种,1,数据抓取到客户端,而后上传给服务器;2,有客户端控制,在服务器实行抓取。
全自动还不错,不过,一般来说搬家工具不是万能的,比如能抓sina的,未必能抓163的。因此,我个人认为还是有客户端控制,在服务器实行抓取最不错。
客户端设计来说,非常简单。要涉及,要搬家的博客网站,和在现在博客网站的用户,还有文章搬到现在网站的哪个分类。有些网站读取分页很麻烦,可以直接指定。
![](http://images.cnblogs.com/cnblogs_com/birdshover/catch/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等待连接
![](http://www.cnblogs.com/Images/dot.gif)
");
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;
}
![](http://images.cnblogs.com/cnblogs_com/birdshover/catch/server.gif)
![](http://images.cnblogs.com/cnblogs_com/birdshover/catch/server2.gif)
操作密码自然是让指定的人用了,预先MD5下再发就好了。
相关文章推荐
- 博客搬家工具
- 博客导出工具(C++实现,支持sina,csdn,自定义列表)
- NSIS打包工具实现:快捷方式附加到开始菜单、锁定到任务栏
- 实现侧边栏工具(1)使用背景图片方式
- 写markdown博客如何将截图快速上传到图床——记一个工具插件的实现
- 秋色园QBlog技术原理解析:博客一键安装工具技术实现[附源码下载]
- unity 实现另一个unity软件的安装工具(4)——unity调用外部程序,三种路径方式
- 【工具,组件类】登录,评论的验证码通过kaptcha的实现的方式
- 在RobotArt中实现快换工具自动装配和卸载的方式
- 秋色园QBlog技术原理解析:博客一键安装工具技术实现[附源码下载]
- pc-lint静态代码分析工具(检查linux下C++代码的实现方式)
- (开源) Ring3下的DLL注入工具 x86&x64(NtCreateThreadEx + LdrLoadDll方式实现,可以注入系统进程)
- 对了,CSDN博客有搬家工具没
- 开源->一步步实现cnblogs博客采集工具->对项目需求的分析
- 【工具代码】JavaScript实现右键菜单的一种方式
- 使用React和webpack工具实现自己的博客页面
- linux环境下C语言实现非阻塞方式读取字符串数据的串口测试程序,即串口工具的编写
- 一步步实现cnblogs博客采集工具详细设计
- MSN博客搬家工具
- unity 实现另一个unity软件的安装工具(5)——创建桌面快捷方式