Den här serien tar upp socketprogrammering i C# där fokus inte ligger på just nätverksprogrammeringen utan på hur man kan nyttja den i praktiken. Vi kommer att gå igenom hur man kodar en Webserver, en Irc-klient och lite annat. Häng med!
Navigation:
Webserverprogrammering i C#
Oavsett vad man gör så kommer man slutligen till ett läge då man känner av ensamheten. Behovet av att kommunicera med medmänniskor är medfött och lika livsnödvändigt som att andas. Detta gäller även personer som tillbringar sin tid framför datorn, därför kan det vara bra att kunna göra program som tar hänsyn till det här ytterst grundläggande behovet.
Nätverksprogrammering kan vara hur invecklad som helst, men man kan också göra användbara saker relativt enkelt. I exemplet jag kommer visa på används C# för att bygga en enkel webserver. Att skriva om den till något annat språk eller annan plattform är busenkelt. Man bör ha lite kunskaper i C# för att hänga med, men om man behärskar språk som C++ eller java borde man inte ha något problem att förstå principen.
Serverklassen:
Först behöver vi en serverklass som hanterar allt dataskickande.
De bibliotek vi behöver är följande:
using System; using System.IO; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading;
private Socket m_Socket;
private string m_Root;
public server(Socket s, string loc)
{
m_Socket = s;
m_Root = loc + "\";
}
private void SendToBrowser(byte[] data)
{
if( m_Socket.Connected )
{
if(m_Socket.Send(data,data.Length,0) == 1)
{
// Socket error Console.WriteLine("Kunde inte skicka data pga socketfel..");
}
}
}
private void SendHeader(string httpVersion,string mimetype,int totBytes,string statusCode) { string buffer; buffer = httpVersion + statusCode + " "; buffer = buffer + "Server: HqspyServer "; buffer = buffer + "Content-Type: " + mimetype + " "; buffer = buffer + "AcceptRange: bytes "; buffer = buffer + "Content-Length: " + totBytes + " "; byte[] data = Encoding.ASCII.GetBytes(buffer); SendToBrowser(data); }
private string GetMimetype(string file) { if( file.EndsWith(".htm") ||file.EndsWith(".html")) return "text/html"; else if( file.EndsWith(".jpg") || file.EndsWith(".jpeg")) return "image/jpeg"; else if( file.EndsWith(".gif")) return "image/gif"; else if( file.EndsWith(".txt")) return "text/plain"; else return "application/octet-stream"; }
if( buffer.Substring(0,3) != "GET") { /* Error! hanterar bara GET */ Console.WriteLine("Fel - Hanterar bara GET förfrågningar"); m_Socket.Close(); }
int startPos = buffer.IndexOf("HTTP",1); string httpVersion = buffer.Substring(startPos,8); string request = buffer.Substring(0, startPos -1); // requesten request.Replace("\","/"); // lägg till ett "/" om det rör sig om en katalog som inte är utmärkt. if( (request.IndexOf(".")<1) && (!request.EndsWith("/"))) request = request + "/";
startPos = request.LastIndexOf("/") + 1; string reqFile = request.Substring(startPos); // Filen vi ska läsa in string dirname = request.Substring(request.IndexOf("/"),request.IndexOf("/")-3); if(reqFile.Length == 0) reqFile = "index.htm"; string mimetype = this.GetMimetype(reqFile); string filepath = m_Root + dirname + reqFile; Console.WriteLine("Skickar fil: " + reqFile);
if(File.Exists(filepath) == false) { string sError = "<h2>Error: 404, file does not exist</h2>"; SendHeader(httpVersion,"",sError.Length," 404 Not Found"); Byte[] data = Encoding.ASCII.GetBytes(sError); SendToBrowser(data); m_Socket.Close(); return; } else { FileStream fs = new FileStream(filepath,FileMode.Open,FileAccess.Read,FileShare.Rea); BinaryReader br = new BinaryReader(fs); byte[] bytes = new byte[fs.Length]; bytes = br.ReadBytes((int)fs.Length); int totBytes = (int)fs.Length; br.Close(); fs.Close(); SendHeader(httpVersion,mimetype,totBytes," 200 OK"); SendToBrowser(bytes); Console.WriteLine("Skickat: " + bytes.Length + " bytes "); } m_Socket.Close(); } }
using System; using System.Threading; using System.IO; using System.Net; using System.Net.Sockets;
class Class1 { [STAThread] static void Main(string[] args) { Class1 c = new Class1(); Thread t = new Thread(new ThreadStart(c.RunServer)); t.Start(); }
private void RunServer() { IPHostEntry ip = Dns.GetHostByName(Dns.GetHostName()); IPEndPoint EP = new IPEndPoint(ip.AddressList[0],80); Socket s = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); s.Bind(EP); s.Listen(20); Console.WriteLine("Lyssnar.. "); //Lyssna och hantera kopplingar while(true) { Socket newSock = s.Accept(); Console.WriteLine("Förfrågan från: " + newSock.RemoteEndPoint + "..."); server serv = new server(newSock,"c:\webserver"); Thread t = new Thread(new ThreadStart( serv.Process)); t.IsBackground = true; t.Priority = ThreadPriority.BelowNormal; t.Start(); } } }
Navigation:
Datum
2024-12-21 17:14
Vecka: 51
Besökare
Inloggade: 0
Gäster: 605
Medlemmar
Medlemmar: 53576
Forum
Senaste inlägget: HAHA MÄNNISKAN LEVER ÄN (13:45 - 18:e Januari 2019, av Hetzz)
Wiki
Senaste ändringen:
3D (rev: 1, tid: 09:40 - 13:e November 2015)
Chatt
#blinkenlights @ Libera.Chat
Gratis shellkonton för IRC, webbsidor mm.