两个SQL数据库服务器,一个在公网服务器上,一个在本地!能不能关联操作?
接到一个任务,有2台机器,其中有一台机器A有每天数据库的备份,我想另外的一台机器B定时从A中copy到B的制定目录,A不共享数据库备份的目录。考虑到FTP方式无法跨越NAT(网络地址转换),而HTTP方式在安全性和可靠性方面都得不到保证,在文件较大时也会有一定的限制。决定采用一种基于HTTP协议,编写客户端和服务器端程序,在一个客户端用HttpWebRequest对象向指定的URL发送POST和GET请求,在服务器端通过程序接受请求,进行文件传输,这样,发送和接收都由自己编写的程序进行控制,可以方便地实现诸如身份验证、数据加密和断点续传等功能,同时可以穿越防火墙和NAT。这样做就可以实现在Net中跨Internet的文件加密传输。
在net中实现跨Internet的文件加密传输的程序源码
一、数据上传
1客户端代码
//从文本框中获得文件的全称,含路径名
string strFilePath=txUpFileText;
//获得文件的长度
FileInfo fi=new FileInfo(strFilePath);
long lFileLength=fiLength;
//获得文件名
string strFileName=strFilePathSubstring(strFilePathLastIndexOf("\\")+1);
//创建HttpWebRequest对象,传入路径名,将文件名和长度作为参数传给服务器端
HttpWebRequest objRequest=(HttpWebRequest)HttpWebRequestCreate(string
Format(@"{0}FileName={1}&FileLength={2}",txUpURLText,strFileName,
lFileLengthToString()));
//定义Request对象的方法为"post"
objRequestMethod="POST";
//定义Request对象的内容类型为"application/octet-stream"
objRequestContentType="application/octet-stream";
//定义请求内容的长度
objRequestContentLength=((int)(lFileLength/8+1))8;
//定义一个请求的流
Stream reqStream=objRequestGetRequestStream();
//用DES算法加密此请求流
byte[] desKey={1,0,1,1,5,6,7,8};
byte[] desIV={1,2,3,4,5,6,7,8};
DES des=new DESCryptoServiceProvider();
CryptoStream encStream=new CryptoStream(reqStream,desCreateEncrytor(desKey,desIV),CryptoStreamModeWrite);
//定义内存缓冲区用于文件的读写
int iBufferSize=4095;
byte[] buffer=new byte[iBufferSize];
//打开文件,准备读取
FileStream fileStream=new FileStream(strFilePath,FileModeOpen,FileAccessRead);
int iReadLength=0;
//将文件内容读入缓冲区
iReadLength=fileStreamRead(buffer,0,bufferLength);
while(iReadLength!=0) {
//将读出的文件内容写入加密流
encStreamWrite(buffer,0,iReadLength);
iReadLength=fileStreamRead(buffer,0,bufferLength);
}
//关闭请求的流
encStreamClose();
reqStreamClose();
fileStreamClose();
//向服务器提出请求并获得结果3
HttpWebResponse sp=(HttpWebResponse)objRequestGetResponse();
string strContent="";
int iLen=(int)spContentLength;
if(iLen>0) {
//将结果流写入到二进制流bContent中
Stream resStream=spGetResponseStream();
byte[] bContent=new byte[spContentLength];
resStreamRead(bContent,0,iLen);
spClose();
//由于结果是一个二进制数据,必须将结果解码成字符串
char[] charContent=new char[spContentLength];
TextDecoder dc=TextEncodingUTF8GetDecoder();
int charLen=dcGetChars(bContent,0,bContentLength,charContent,0);
foreach(char c in charContent) strContent+=cToString();
}
2服务器端代码
//判断请求的ContentType,过滤非法请求
if(RequestContentType!="application/octet-stream") return;
//获得上传得文件名和长度
string strFileName=RequestQueryString["FileName"];
int iFileLength=RequestTotalBytes;
//构造服务器端文件名
string strFilePath=ServerMapPath("")+IOPathDirectorySeparatorChar+"Upload"+IOPathDirectorySeparatorChar+strFileName;
//判断文件是否存在
if(FileExists(strFilePath)) {
//如果文件存在,返回文件名和文件长度
FileInfo fi=new FileInfo(strFilePath);
long lFileLength=fiLength;
ResponseWrite("File["+strFileName+"]Exists!Length="+lFileLengthToString());
ResponseEnd();
}
//如果文件不存在,打开文件流创建该文件
FileStream fileStream=FileCreate(strFilePath,iFileLength);
//用DES算法解密该文件流
byte[] desKey={1,0,1,1,5,6,7,8};
byte[] desIV={1,2,3,4,5,6,7,8};
DES des=new DESCryptoServiceProvider();
CryptoStream desStream=new CryptoStream(fileStream,desCreateDecryptor(desKey,desIV),CryptoStreamModeWrite);
//定义内存缓冲区大小
int iBufferSize=4095;
//读取请求流并写入文件中
byte[] buffer=new byte[iBufferSize];
int iReadLength=0;
iReadLength=RequestInputStreamRead(buffer,0,bufferLength);
while(iReadLength>0) {
desStreamWrite(buffer,0,iReadLength);
desStreamFlush();
iReadLength=RequestInputStreamRead(buffer,0,bufferLength);
}
desStreamFlush();
desStreamClose();
fileStreamClose();
//返回结果
ResponseWrite("File["+strFileName+"]UploadSuccess!");
ResponseEnd();
二、数据下载
1客户端代码
//获取下载文件名
string strFileName=txDownFileText;
//定义文件偏移量
int iOffset=0;
//创建HttpWebRequest对象,传入路径名,将文件名和偏移量作为参数传给服务器
HttpWebRequest objRequest=(HttpWebRequest)HttpWebRequestCreate(string
Format(@"{0}FileName={1}&Offset={2}",txDownURLText,strFileName,iOffset));
//定义Request对象的方法为"get"
objRequestMethod="GET";
//定义Request对象的内容类型为"application/octet-stream"
objRequestContentType="application/octet-stream"
//获得请求结果
HttpWebResponse sp=(HttpWebResponse)objRequestGetResponse();
Stream resStream=spGetResponseStream();
string strFilePath=txDownPathText;
//如果文件存在,则删除
if(FileExists(strFilePath)) {
FileDelete(strFilePath);
}
//创建文件
int iBufferSize=4095;
FileStream fileStream=FileCreate(strFilePath);
//解密返回的流
byte[] desKey={1,0,1,1,5,6,7,8};
byte[] desIV={1,2,3,4,5,6,7,8};
DES des=new DESCryptoServiceProvider();
CryptoStream decStream=new CryptoStream(resStream,desCreateDecryptor(desKey,desIV),CryptoStreamModeRead);
byte[] buffer=new byte[iBufferSize];
int iReadLength=0;
//读取返回流
iReadLength=decStreamRead(buffer,0,bufferLength);
while(iReadLength>0) {
//写入文件流中
fileStreamWrite(buffer,0,iReadLength);
iReadLength=decStreamRead(buffer,0,bufferLength);
}
fileStreamFlush();
decStreamClose();
fileStreamClose();
resStreamClose();
return "File["+strFileName+"]Download Success!";
2服务器端代码
//获得上传的文件名和偏移量
string strFileName=RequestQueryString["FileName"];
long lOffset=ConvertToInt64(RequestQueryString["Offset"]);
//构造文件全路径名
string strFilePath=ServerMapPath("")+IOPathDirectorySeparatorChar+"Download"+IOPathDirectorySeparatorChar+strFileName;
//若文件不存在,则返回错误信息
if(!FileExists(strFilePath)) {
ResponseClear();
ResponseWrite("File["+strFileName+"]Not Exists!");
ResponseEnd();
}
//打开文件
IOFileStream fileStream=new IOFileStream(strFilePath,IOFileModeOpen,IOFileAccessRead,IOFileShareRead);
//根据上传的偏移量参数设置偏移量
if(lOffset>0)
fileStreamSeek(lOffset,IOSeekOriginBegin);
//定义输出流
Stream resStream=ResponseOutputStream;
//用DES算法加密此数据流
byte[] desKey={1,0,1,1,5,6,7,8};
byte[] desIV={1,2,3,4,5,6,7,8};
DES des=new DESCryptoServiceProvider();
CryptoStream encStream=new CryptoStream(resStream,desCreateDecryptor(desKey,desIV),CryptoStreamModeWrite);
//定义输出文件流的头
ResponseContentType="application/octet-stream";
ResponseAddHeader("Content-Disposition","attachment;filename="+strFileName);
int iBufferSize=4095;
byte[] buffer=new byte[iBufferSize];
int iReadLength=0;
//读取文件
iReadLength=fileStreamRead(buffer,0,bufferLength);
while(iReadLength>0) {
//写入输出流
encStreamWrite(buffer,0,iReadLength);
iReadLength=fileStreamRead(buffer,0,bufferLength);
}
encStreamFlush();
resStreamFlush();
//关闭流
encStreamClose();
resStreamClose();
fileStreamClose();
//ResponseFlush();
//结束输出
ResponseEnd();
1,双机热备特指基于高可用系统中的两台服务器的热备(或高可用),因两机高可用在国内使用较多,故得名双机热备。
2,以一般常用的SQL服务的双机热备为例:先在两台服务器上安装服务器系统。
3,然后建立一个或多个磁盘阵列,将两台服务器上的SQL数据保存在磁盘阵列上。
4,然后安装一款集群软件,如:微软MSCS,Symantec VCS,ATANG Cluster等。
5,然后在软件上分别设置主和副服务器。以MSCS为例,先在服务器上安装Advanced Server或DataCenter Server。 然后在两台服务器添加相同的管理员帐号和密码。即帐号在每个节点上,都必须具有管理员权限。所有节点都必须是成员服务器,或者所有的节点是同一个域里的域控制器。在群集中,不允许一部分是域成员,一部分是域控制器。
6,然后安装集群管理软件,开启磁盘阵列,在两台电脑上设置共享磁盘,并验证共享磁盘国。
7,然后关闭第一个服务器,配置第二个节点,配置完成后,关闭第二个服务器,打开第一个服务器,配置第一个节点。
8,最后,开启两个服务器和磁盘阵列。
1、下载地点,建议用电驴搜索一下
2、2003不清楚;2008标准版,买1送1,但是仅限于虚拟机;2008企业版买1送4,也是仅限于虚拟机。也就是说,买了一套只能在一台物理服务器上激活一套,你得购买2套。这个是微软的政策,至于破解的或者盗版的,没用用过。
1、链接服务器,此种方式较为安全。验证是数据库级别的验证。
2、使用域环境+足够权限的SQL用户权限,就可以访问。
3、使用证书验证(非域环境),配置较以上两种方式复杂。
楼主弄混了服务器数量和IP数量的关系。
简单举例:
我有一个网站,因点击率高,所以要做成2个服务器提供服务。
正确的做法是,我将两台服务器连到一台负载均衡器上,再将负载均衡器连入互联网。
我的两台服务器只有内网IP,而公共IP是在负载均衡器上的。
接到访问时,先由负载均衡器处理,根据预设的均衡方案将访问送入某一台服务器进行处理。
而2台服务器共用一套存储系统就是服务器集群的范畴了,与楼主的问题没什么关系了。
所以说,一个域名只能绑定一个公共IP,而一个公共IP却可以同时使用多台服务器。
0条评论