Socket C# Server ทำ 1 Request : 1 Thread (2009-09-11)
using System;
using System.Threading;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Configuration;
class EmployeeTCPServer
{
static TcpListener listener;
static Socket soc;
const int LIMIT = 5; //5 concurrent clients
public static void Main()
{
System.Net.IPAddress localaddr = System.Net.IPAddress.Parse("127.0.0.1");
listener = new TcpListener(localaddr, 2055);
listener.Start();
Console.WriteLine("Server mounted, listening to port 2055");
Thread t = new Thread(new ThreadStart(Recieve));
t.Start();
}//main
public static void Recieve()
{
while(true)
{
try
{
Socket soc = listener.AcceptSocket();
if (soc.Connected)
{
Thread t = new Thread(new ThreadStart(Recieve));
t.Start();
}
Console.WriteLine("Connected: {0}", soc.RemoteEndPoint);
Stream s = new NetworkStream(soc);
StreamReader sr = new StreamReader(s);
StreamWriter sw = new StreamWriter(s);
sw.AutoFlush = true; // enable automatic flushing
// sw.WriteLine("{0} Employees available",ConfigurationSettings.AppSettings.Count);
while (true)
{
string name = sr.ReadLine();
if (name == "" || name == null) break;
string job = name;
if (job == null) job = "No such employee";
Console.WriteLine("Recieve => " + job);
sw.WriteLine("You send me ==> " + job);
}
s.Close();
soc.Close();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.WriteLine("Kill Thread");
Thread.CurrentThread.Abort();
//connection lost here
}
}
}
}
สีแดงคือที่เพิ่มเติมนะครับ โดยเฉพาะ Thread.CurrentThread.Abort(); ถ้าลืมล่ะก้อ Thread จะวิ่งเผ่นผ่านเต็มเมมโมรี่ของคุณเลยครับ เพราะว่ามี while(true) หุหุ
ข้างล่างนี่ Client นะครับ
using System;
using System.IO;
using System.Net.Sockets;
class EmployeeTCPClient
{
public static void Main()
{
TcpClient client; // = new TcpClient("10.164.195.162", 2055);
try
{
client = new TcpClient("127.0.0.1", 2055);
Stream s = client.GetStream();
StreamReader sr = new StreamReader(s);
StreamWriter sw = new StreamWriter(s);
sw.AutoFlush = true;
Console.WriteLine("a");
//Console.WriteLine(sr.ReadLine());
Console.WriteLine("b");
while (true)
{
Console.Write("Name: ");
string name = Console.ReadLine();
sw.WriteLine(name);
if (name == "") break;
Console.WriteLine(sr.ReadLine());
}
s.Close();
}catch(Exception exp)
{
Console.WriteLine("Error : " + exp);
}
Console.Read();
}
}
|