跨网段浏览器总结
软件描述:
跨网段浏览器利用一个客户端和服务端的网络通信达到跨网段的目的。我们有很多的网站不能访问,受到了防火墙的屏蔽,而这些网站在国外或者其它地区可以访问,那么我们可以将服务端运行在这些“自由区”,然后通过客户端向服务端请求,服务端帮我们下载好网页信息传送给客户端,这样我们就能浏览这些原本不能访问的资源了。我们的客户端和服务端之间的通信可以嵌入到一些不被屏蔽的通信软件中,如MSN,通过我们自己定制的MSN可以实现这样的功能。
软件总结
Socket通信
我做的这个客户端和服务端并没有嵌入MSN之类的软件,所以用的是Socket通信,现在简单的总结一下。
客户端代码:
using System;
using System.Text;//For Encoding
using System.IO;//For IOException
using System.Net.Sockets;//For
Socket,SocketException
using System.Net;//For IPAddress,IPEndPoint
namespace Client
{
class Program
{
static void Main(string[] args)
{
string serverAddress = "localhost";
int serverPort = 9999;
Socket client = new
Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPEndPoint ipep = new
IPEndPoint(Dns.Resolve(serverAddress).AddressList[0],
serverPort);
client.Connect(ipep);
while (true)
{
//send
string message = Console.ReadLine();
byte[] url = Encoding.UTF8.GetBytes(message);
client.Send(url);
Console.WriteLine("URL已发送");
//receive
FileStream file = File.Open("come.mht", FileMode.OpenOrCreate);
byte[] rcvBuffer = new
byte[1000000];
int rcv = client.Receive(rcvBuffer);
file.Write(rcvBuffer,
0, rcv);
Console.WriteLine("mht收到");
file.Close();
}
Console.ReadKey();
}
}
}
描述:客户端的建立主要经过以下步骤:首先确定服务端的地址和端口,然后建立Socket实例和IPEndPoint实例,Socket实例通过Connet方法连接到IPEndPoint后,接下来就可以通过Send和Receive方法与服务端进行通信了。需要注意的是,发送的信息是字节流,所以在发送之前我们要对这些信息进行编码,Encoding.UTF8.GetBytes(mes)可以达到这个目的。还有发送字节的时候一定要注意发送的字节长度。
当发送完URL信息之后,服务器会返回一个mht文件的字节流,这里我们自己创建一个文件come.mht然后将字节流写入即可。当然我们还可以以系统时间来命名收到的mht文件:
DateTime dt = new DateTime(2000,
1, 1);
TimeSpan ts = DateTime.Now - dt;
int seconds = (int)ts.TotalSeconds;
FileStream file = File.Open(".\\cache\\"
+ seconds.ToString() + ".mht",
FileMode.OpenOrCreate);
byte[] rcvBuffer = new byte[1000000];
int rcv = client.Receive(rcvBuffer);
file.Write(rcvBuffer,
0, rcv);
file.Close();
服务端代码:
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
namespace Server
{
class Program
{
static void Main(string[] args)
{
int port = 9999;
IPEndPoint ipep = new
IPEndPoint(IPAddress.Any, port);
Socket server = new
Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
server.Bind(ipep);
server.Listen(1);
Socket client = server.Accept();
while (true)
{
try
{
//receive
byte[] rcvBuffer = new
byte[1000000];
int rcv = client.Receive(rcvBuffer);
Console.WriteLine("收到URL,开始生成mht");
Console.WriteLine(Encoding.UTF8.GetString(rcvBuffer,
0, rcv));
//生成mht
CDO.Message
msg = new CDO.MessageClass();
CDO.Configuration
cfg = new CDO.ConfigurationClass();
msg.Configuration = cfg;
msg.CreateMHTMLBody(Encoding.UTF8.GetString(rcvBuffer, 0,
rcv),
CDO.CdoMHTMLFlags.cdoSuppressAll, "", "");
msg.GetStream().SaveToFile("a.mht",
ADODB.SaveOptionsEnum.adSaveCreateOverWrite);
//send
Console.WriteLine("mht生成完毕,开始发送");
FileStream file = File.Open("a.mht", FileMode.Open);
byte[] sendBuffer = new
byte[1000000];
file.Read(sendBuffer,
0, (int)file.Length);
client.Send(sendBuffer,
0, (int)file.Length, SocketFlags.None);
file.Close();
Console.WriteLine("发送完毕");
}
catch (SocketException se)
{
Console.WriteLine(se.Message);
Environment.Exit(se.ErrorCode);
}
}
Console.ReadKey();
}
}
}
描述:首先确定服务端的端口号和IPEndPoint,然后创建Socket实例,然后Socket实例绑定IPEndPoint,使用Listen方法开始监听。当有客户端进行连接时创建信息发送接收的Socket实例client,实例从server.Accept()方法获取。接下来的信息发送和接收与客户端相似。
这里我们使用代码从特定的URL上获取网页信息然后转换为mht文件,以下为转换代码:
CDO.Message
msg = new CDO.MessageClass();
CDO.Configuration
cfg = new CDO.ConfigurationClass();
msg.Configuration = cfg;
msg.CreateMHTMLBody(Encoding.UTF8.GetString(rcvBuffer, 0,
rcv),
CDO.CdoMHTMLFlags.cdoSuppressAll,
"", "");
msg.GetStream().SaveToFile("a.mht",ADODB.SaveOptionsEnum.adSaveCreateOverWrite);
在使用CDO之前,我们首先要在解决方案的引用中添加Microsoft CDO for Windows 2000 Library的COM组件。如果不能编译提示“互操作错误”,那么我们只需要将引用中的CDO组件的互操作属性设为false即可。
关于控件的使用
多标签浏览器需要用到TabControl控件,需要注意的是,我们使用TabControl控件创建的TabPage时,需要用代码动态向其中添加WebBrowser控件。同时使用一个ArrayList动态数组保存每个标签的URL,当切换标签时候触发SelectedIndexChanged事件。
后台任务可以在BackGroundWorker控件中执行,这样可以防止前台界面没有响应。