Csharp/CSharp Tutorial/Network/Socket Server — различия между версиями
Admin (обсуждение | вклад) м (1 версия) |
(нет различий)
|
Текущая версия на 15:20, 26 мая 2010
Содержание
- 1 Accepting a socket connection (simple file-server)
- 2 GUI based Tcp Server
- 3 Listen for Socket Request in Thread
- 4 Simple Tcp server: receive data from a client
- 5 Tcp server based on Thread
- 6 Tcp server: use StreamWriter and StreamReader to read and write to a client
- 7 ThreadPool based Tcp server
- 8 Use background thread to deal with the Server socket
Accepting a socket connection (simple file-server)
<source lang="csharp">using System; using System.Collections.Generic; using System.Collections.Specialized; using System.IO; using System.IO.rupression; using System.Net; using System.Net.Mail; using System.Net.Sockets; using System.Runtime.InteropServices; using System.Text; public class MainClass {
private static void HandleRequest(object state) { using (Socket client = (Socket)state) using (NetworkStream stream = new NetworkStream(client)) using (StreamReader reader = new StreamReader(stream)) using (StreamWriter writer = new StreamWriter(stream)) { string fileName = reader.ReadLine(); writer.Write(File.ReadAllText(fileName)); } } public static void Main() { using (Socket s = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp)) { s.Bind(new IPEndPoint(IPAddress.Loopback, 9999)); s.Listen(3); Socket client = s.Accept(); ThreadPool.QueueUserWorkItem(HandleRequest, client); } }
}</source>
GUI based Tcp Server
<source lang="csharp">/* Quote from C# Network Programming
- Paperback: 656 pages
- Publisher: Sybex (November 26, 2002)
- Language: English
- ISBN-10: 0782141765
- ISBN-13: 978-0782141764
- /
using System; using System.Drawing; using System.Net; using System.Net.Sockets; using System.Text; using System.Windows.Forms;
public class AsyncTcpSrvr : Form {
private TextBox conStatus; private ListBox results; private byte[] data = new byte[1024]; private int size = 1024; private Socket server;
public AsyncTcpSrvr() { Text = "Asynchronous TCP Server"; Size = new Size(400, 380); results = new ListBox(); results.Parent = this; results.Location = new Point(10, 65); results.Size = new Size(350, 20 * Font.Height); Label label1 = new Label(); label1.Parent = this; label1.Text = "Text received from client:"; label1.AutoSize = true; label1.Location = new Point(10, 45); Label label2 = new Label(); label2.Parent = this; label2.Text = "Connection Status:"; label2.AutoSize = true; label2.Location = new Point(10, 330); conStatus = new TextBox(); conStatus.Parent = this; conStatus.Text = "Waiting for client..."; conStatus.Size = new Size(200, 2 * Font.Height); conStatus.Location = new Point(110, 325); Button stopServer = new Button(); stopServer.Parent = this; stopServer.Text = "Stop Server"; stopServer.Location = new Point(260,32); stopServer.Size = new Size(7 * Font.Height, 2 * Font.Height); stopServer.Click += new EventHandler(ButtonStopOnClick); server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050); server.Bind(iep); server.Listen(5); server.BeginAccept(new AsyncCallback(AcceptConn), server); } void ButtonStopOnClick(object obj, EventArgs ea) { Close(); } void AcceptConn(IAsyncResult iar) { Socket oldserver = (Socket)iar.AsyncState; Socket client = oldserver.EndAccept(iar); conStatus.Text = "Connected to: " + client.RemoteEndPoint.ToString(); string stringData = "Welcome to my server"; byte[] message1 = Encoding.ASCII.GetBytes(stringData); client.BeginSend(message1, 0, message1.Length, SocketFlags.None, new AsyncCallback(SendData), client); } void SendData(IAsyncResult iar) { Socket client = (Socket)iar.AsyncState; int sent = client.EndSend(iar); client.BeginReceive(data, 0, size, SocketFlags.None, new AsyncCallback(ReceiveData), client); } void ReceiveData(IAsyncResult iar) { Socket client = (Socket)iar.AsyncState; int recv = client.EndReceive(iar); if (recv == 0) { client.Close(); conStatus.Text = "Waiting for client..."; server.BeginAccept(new AsyncCallback(AcceptConn), server); return; } string receivedData = Encoding.ASCII.GetString(data, 0, recv); results.Items.Add(receivedData); byte[] message2 = Encoding.ASCII.GetBytes(receivedData); client.BeginSend(message2, 0, message2.Length, SocketFlags.None, new AsyncCallback(SendData), client); } public static void Main() { Application.Run(new AsyncTcpSrvr()); }
}</source>
Listen for Socket Request in Thread
<source lang="csharp">using System; using System.Text; using System.Threading; using System.Net; using System.Net.Sockets; public class MainClass {
static void ListenForRequests() { int CONNECT_QUEUE_LENGTH = 4; Socket listenSock = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp ); listenSock.Bind( new IPEndPoint(IPAddress.Any,9999) ); listenSock.Listen( CONNECT_QUEUE_LENGTH ); while( true ) { using( Socket newConnection = listenSock.Accept() ) { // Send the data. byte[] msg = Encoding.UTF8.GetBytes( "Hello World!" ); newConnection.Send( msg, SocketFlags.None ); } } } static void Main() { // Start the listening thread. Thread listener = new Thread(new ThreadStart(ListenForRequests) ); listener.IsBackground = true; listener.Start(); Console.WriteLine( "Press <enter> to quit" ); Console.ReadLine(); }
}</source>
Simple Tcp server: receive data from a client
<source lang="csharp">using System; using System.Net; using System.Net.Sockets; using System.Text; class MainClass {
public static void Main() { IPEndPoint ip = new IPEndPoint(IPAddress.Any,9999); Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); socket.Bind(ip); socket.Listen(10); Console.WriteLine("Waiting for a client..."); Socket client = socket.Accept(); IPEndPoint clientep =(IPEndPoint)client.RemoteEndPoint; Console.WriteLine("Connected with {0} at port {1}",clientep.Address, clientep.Port); string welcome = "Welcome"; byte[] data = new byte[1024]; data = Encoding.ASCII.GetBytes(welcome); client.Send(data, data.Length,SocketFlags.None); while(true) { data = new byte[1024]; int receivedDataLength = client.Receive(data); Console.WriteLine(Encoding.ASCII.GetString(data, 0, receivedDataLength)); client.Send(data, receivedDataLength, SocketFlags.None); } Console.WriteLine("Disconnected from {0}",clientep.Address); client.Close(); socket.Close(); }
}</source>
Tcp server based on Thread
<source lang="csharp">using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; class MainClass {
public static void Main() { TcpListener client = new TcpListener(9050); client.Start(); Console.WriteLine("Waiting for clients..."); while(true) { while (!client.Pending()) { Thread.Sleep(10000); } ConnectionThread newconnection = new ConnectionThread(client); } }
} class ConnectionThread {
TcpListener threadListener; public ConnectionThread(TcpListener lis){ threadListener = lis; Thread newthread = new Thread(new ThreadStart(HandleConnection)); newthread.Start(); } public void HandleConnection() { byte[] data = new byte[1024]; TcpClient client = threadListener.AcceptTcpClient(); NetworkStream ns = client.GetStream(); string welcome = "Welcome"; data = Encoding.ASCII.GetBytes(welcome); ns.Write(data, 0, data.Length); while(true) { data = new byte[1024]; int recv = ns.Read(data, 0, data.Length); if (recv == 0) break; ns.Write(data, 0, recv); } ns.Close(); client.Close(); }
}</source>
Tcp server: use StreamWriter and StreamReader to read and write to a client
<source lang="csharp">using System; using System.IO; using System.Net; using System.Net.Sockets; using System.Text; class MainClass {
public static void Main() { string data; IPEndPoint ip = new IPEndPoint(IPAddress.Any, 9999); Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); socket.Bind(ip); socket.Listen(10); Socket client = socket.Accept(); IPEndPoint newclient = (IPEndPoint)client.RemoteEndPoint; Console.WriteLine("Connected with {0} at port {1}",newclient.Address, newclient.Port); NetworkStream ns = new NetworkStream(client); StreamReader sr = new StreamReader(ns); StreamWriter sw = new StreamWriter(ns); string welcome = "Welcome"; sw.WriteLine(welcome); sw.Flush(); while(true) { data = sr.ReadLine(); Console.WriteLine(data); sw.WriteLine(data); sw.Flush(); } Console.WriteLine("Disconnected from {0}", newclient.Address); sw.Close(); sr.Close(); ns.Close(); }
}</source>
ThreadPool based Tcp server
<source lang="csharp">using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; class MainClass {
public static void Main() { TcpListener client = new TcpListener(9050); client.Start(); Console.WriteLine("Waiting for clients..."); while(true) { while (!client.Pending()) { Thread.Sleep(1000); } ConnectionThread newconnection = new ConnectionThread(client); } }
} class ConnectionThread {
public TcpListener threadListener; public ConnectionThread(TcpListener lis){ threadListener = lis; ThreadPool.QueueUserWorkItem(new WaitCallback(HandleConnection)); } public void HandleConnection(object state) { int recv; byte[] data = new byte[1024]; TcpClient client = threadListener.AcceptTcpClient(); NetworkStream ns = client.GetStream(); string welcome = "Welcome"; data = Encoding.ASCII.GetBytes(welcome); ns.Write(data, 0, data.Length); while(true) { data = new byte[1024]; recv = ns.Read(data, 0, data.Length); ns.Write(data, 0, recv); } ns.Close(); client.Close(); }
}</source>
Use background thread to deal with the Server socket
<source lang="csharp">using System; using System.Text; using System.Threading; using System.Net; using System.Net.Sockets; public class MainClass {
private const int CONNECT_QUEUE_LENGTH = 4; static void ListenForRequests() { Socket listenSock = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp ); listenSock.Bind( new IPEndPoint(IPAddress.Any, 9999) ); listenSock.Listen( CONNECT_QUEUE_LENGTH ); while( true ) { Socket newConnection = listenSock.Accept(); byte[] msg = Encoding.UTF8.GetBytes( "Hello!" ); newConnection.BeginSend( msg,0, msg.Length, SocketFlags.None, null, null ); } } static void Main() { Thread listener = new Thread(new ThreadStart(ListenForRequests) ); listener.IsBackground = true; listener.Start(); Console.WriteLine( "Press <enter> to quit" ); Console.ReadLine(); }
}</source>