,歡迎訪問網(wǎng)頁(yè)設(shè)計(jì)愛好者web開發(fā)。個(gè)人珍藏,僅為存檔.今天整理磁盤,沒處放.扔blog.
看不懂,別問我.自己研究.
webserver.cs
namespace cnnbsun.webserver
{
using system;
using system.io;
using system.net;
using system.net.sockets;
using system.text;
using system.threading ;
class mywebserver
{
private tcplistener mylistener ;
private int port = 8080 ; // 選者任何閑置端口
//開始兼聽端口
//同時(shí)啟動(dòng)一個(gè)兼聽進(jìn)程
public mywebserver()
{
try
{
//開始兼聽端口
mylistener = new tcplistener(port) ;
mylistener.start();
console.writeline("web server running... press ^c to stop...");
//同時(shí)啟動(dòng)一個(gè)兼聽進(jìn)程 'startlisten'
thread th = new thread(new threadstart(startlisten));
th.start() ;
}
catch(exception e)
{
console.writeline("兼聽端口時(shí)發(fā)生錯(cuò)誤 :" +e.tostring());
}
}
public void sendheader(string shttpversion, string smimeheader, int itotbytes, string sstatuscode, ref socket mysocket)
{
string sbuffer = "";
if (smimeheader.length == 0 )
{
smimeheader = "text/html"; // 默認(rèn) text/html
}
sbuffer = sbuffer + shttpversion + sstatuscode + "/r/n";
sbuffer = sbuffer + "server: cx1193719-b/r/n";
sbuffer = sbuffer + "content-type: " + smimeheader + "/r/n";
sbuffer = sbuffer + "accept-ranges: bytes/r/n";
sbuffer = sbuffer + "content-length: " + itotbytes + "/r/n/r/n";
byte[] bsenddata = encoding.ascii.getbytes(sbuffer);
sendtobrowser( bsenddata, ref mysocket);
console.writeline("total bytes : " + itotbytes.tostring());
}
public void sendtobrowser(string sdata, ref socket mysocket)
{
sendtobrowser (encoding.ascii.getbytes(sdata), ref mysocket);
}
public void sendtobrowser(byte[] bsenddata, ref socket mysocket)
{
int numbytes = 0;
try
{
if (mysocket.connected)
{
if (( numbytes = mysocket.send(bsenddata, bsenddata.length,0)) == -1)
console.writeline("socket error cannot send packet");
else
{
console.writeline("no. of bytes send {0}" , numbytes);
}
}
else
console.writeline("連接失敗....");
}
catch (exception e)
{
console.writeline("發(fā)生錯(cuò)誤 : {0} ", e );
}
}
public static void main()
{
mywebserver mws = new mywebserver();
}
public void startlisten()
{
int istartpos = 0;
string srequest;
string sdirname;
string srequestedfile;
string serrormessage;
string slocaldir;
/////////////////////////////////////注意設(shè)定你自己的虛擬目錄/////////////////////////////////////
string smywebserverroot = "e://mywebserverroot//"; //設(shè)置你的虛擬目錄
//////////////////////////////////////////////////////////////////////////////////////////////////
string sphysicalfilepath = "";
string sformattedmessage = "";
string sresponse = "";
while(true)
{
//接受新連接
socket mysocket = mylistener.acceptsocket() ;
console.writeline ("socket type " +mysocket.sockettype );
if(mysocket.connected)
{
console.writeline("/nclient connected!!/n==================/nclient ip {0}/n",mysocket.remoteendpoint) ;
byte[] breceive = new byte[1024] ;
int i = mysocket.receive(breceive,breceive.length,0) ;
//轉(zhuǎn)換成字符串類型
string sbuffer = encoding.ascii.getstring(breceive);
//只處理"get"請(qǐng)求類型
if (sbuffer.substring(0,3) != "get" )
{
console.writeline("只處理get請(qǐng)求類型..");
mysocket.close();
return;
}
// 查找 "http" 的位置
istartpos = sbuffer.indexof("http",1);
string shttpversion = sbuffer.substring(istartpos,8);
// 得到請(qǐng)求類型和文件目錄文件名
srequest = sbuffer.substring(0,istartpos - 1);
srequest.replace("//","/");
//如果結(jié)尾不是文件名也不是以"/"結(jié)尾則加"/"
if ((srequest.indexof(".") <1) && (!srequest.endswith("/")))
{
srequest = srequest + "/";
}
//得帶請(qǐng)求文件名
istartpos = srequest.lastindexof("/") + 1;
srequestedfile = srequest.substring(istartpos);
//得到請(qǐng)求文件目錄
sdirname = srequest.substring(srequest.indexof("/"), srequest.lastindexof("/")-3);
//獲取虛擬目錄物理路徑
slocaldir = smywebserverroot;
console.writeline("請(qǐng)求文件目錄 : " + slocaldir);
if (slocaldir.length == 0 )
{
serrormessage = "<h2>error!! requested directory does not exists</h2><br>";
sendheader(shttpversion, "", serrormessage.length, " 404 not found", ref mysocket);
sendtobrowser(serrormessage, ref mysocket);
mysocket.close();
continue;
}
if (srequestedfile.length == 0 )
{
// 取得請(qǐng)求文件名
srequestedfile = "index.html";
}
/////////////////////////////////////////////////////////////////////
// 取得請(qǐng)求文件類型(設(shè)定為text/html)
/////////////////////////////////////////////////////////////////////
string smimetype = "text/html";
sphysicalfilepath = slocaldir + srequestedfile;
console.writeline("請(qǐng)求文件: " + sphysicalfilepath);
if (file.exists(sphysicalfilepath) == false)
{
serrormessage = "<h2>404 error! file does not exists...</h2>";
sendheader(shttpversion, "", serrormessage.length, " 404 not found", ref mysocket);
sendtobrowser( serrormessage, ref mysocket);
console.writeline(sformattedmessage);
}
else
{
int itotbytes=0;
sresponse ="";
filestream fs = new filestream(sphysicalfilepath, filemode.open, fileaccess.read, fileshare.read);
binaryreader reader = new binaryreader(fs);
byte[] bytes = new byte[fs.length];
int read;
while((read = reader.read(bytes, 0, bytes.length)) != 0)
{
sresponse = sresponse + encoding.ascii.getstring(bytes,0,read);
itotbytes = itotbytes + read;
}
reader.close();
fs.close();
sendheader(shttpversion, smimetype, itotbytes, " 200 ok", ref mysocket);
sendtobrowser(bytes, ref mysocket);
//mysocket.send(bytes, bytes.length,0);
}
mysocket.close();
}
}
}
}
}