class Program
{
static void Main(string[] args)
{
IPAddress localhost = IPAddress.Parse("127.0.0.1");
TcpListener listener = new System.Net.Sockets.TcpListener(localhost, 1330);
listener.Start();
while (true)
{
Console.WriteLine("Waiting for connection");
//Объект AcceptTcpClient ждет соединения с клиентом
TcpClient client = listener.AcceptTcpClient();
//Запустить новый поток выполнения для обработки этого соединения, чтобы иметь
//возможность вернуться к ожиданию очередного соединения
Thread thread = new Thread(new ParameterizedThreadStart(HandleClientThread));
thread.Start(client);
}
}
static void HandleClientThread(object obj)
{
TcpClient client = obj as TcpClient;
bool done = false;
while (!done)
{
string received = ReadMessage(client);
Console.WriteLine("Received: {0}", received);
done = received.Equals("bye");
if (done) SendResponse(client, "BYE");
else SendResponse(client, "OK");
}
client.Close();
Console.WriteLine("Connection closed");
}
private static string ReadMessage(TcpClient client)
{
byte[] buffer = new byte[256];
int totalRead = 0;
do
{
int read = client.GetStream().Read(buffer, totalRead, buffer.Length - totalRead);
totalRead += read;
} while (client.GetStream().DataAvailable);
return Encoding.Unicode.GetString(buffer, 0, totalRead);
}
private static void SendResponse(TcpClient client, string message)
{
byte[] bytes = Encoding.Unicode.GetBytes(message);
client.GetStream().Write(bytes, 0, bytes.Length);
}
}
Помогите с System.Net.Sockets
Оригинал:
Код:
Вот что получается у меня:
Код:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
IPAddress localhost = IPAddress.Parse("127.0.0.1");
TcpListener listener = new System.Net.Sockets.TcpListener(localhost, 1330);
listener.Start();
while (true)
{
textBox1.Text += "Waiting for connection";
TcpClient client = listener.AcceptTcpClient();
Thread thread = new Thread(new ParameterizedThreadStart(HandleClientThread));
thread.Start(client);
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void HandleClientThread(object obj)
{
TcpClient client = obj as TcpClient;
bool done = false;
while (!done)
{
string received = ReadMessage(client);
textBox1.Text += "Received: {0}" + received;
done = received.Equals("bye");
if (done) SendResponse(client, "BYE");
else SendResponse(client, "OK");
}
client.Close();
textBox1.Text += "Connection closed";
}
private static string ReadMessage(TcpClient client)
{
byte[] buffer = new byte[256];
int totalRead = 0;
do
{
int read = client.GetStream().Read(buffer, totalRead, buffer.Length - totalRead);
totalRead += read;
} while (client.GetStream().DataAvailable);
return Encoding.Unicode.GetString(buffer, 0, totalRead);
}
private static void SendResponse(TcpClient client, string message)
{
byte[] bytes = Encoding.Unicode.GetBytes(message);
client.GetStream().Write(bytes, 0, bytes.Length);
}
}
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
IPAddress localhost = IPAddress.Parse("127.0.0.1");
TcpListener listener = new System.Net.Sockets.TcpListener(localhost, 1330);
listener.Start();
while (true)
{
textBox1.Text += "Waiting for connection";
TcpClient client = listener.AcceptTcpClient();
Thread thread = new Thread(new ParameterizedThreadStart(HandleClientThread));
thread.Start(client);
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void HandleClientThread(object obj)
{
TcpClient client = obj as TcpClient;
bool done = false;
while (!done)
{
string received = ReadMessage(client);
textBox1.Text += "Received: {0}" + received;
done = received.Equals("bye");
if (done) SendResponse(client, "BYE");
else SendResponse(client, "OK");
}
client.Close();
textBox1.Text += "Connection closed";
}
private static string ReadMessage(TcpClient client)
{
byte[] buffer = new byte[256];
int totalRead = 0;
do
{
int read = client.GetStream().Read(buffer, totalRead, buffer.Length - totalRead);
totalRead += read;
} while (client.GetStream().DataAvailable);
return Encoding.Unicode.GetString(buffer, 0, totalRead);
}
private static void SendResponse(TcpClient client, string message)
{
byte[] bytes = Encoding.Unicode.GetBytes(message);
client.GetStream().Write(bytes, 0, bytes.Length);
}
}
Как я понял цикл вешает процесс.
Пробовал писать в Form Load, тогда просто форма не грузится...
Возможно нужно event делать, но я их никогда не писал...
upd.
Прочитал про подобный случай, действительно цикл вешает приложение, его нужно во втором потоке запускать.
Я с таким не сталкивался, надеюсь на вашу помощь...
Код:
while (true)
{
Console.WriteLine("Waiting for connection");
//Объект AcceptTcpClient ждет соединения с клиентом
TcpClient client = listener.AcceptTcpClient();
//Запустить новый поток выполнения для обработки этого соединения, чтобы иметь
//возможность вернуться к ожиданию очередного соединения
Thread thread = new Thread(new ParameterizedThreadStart(HandleClientThread));
thread.Start(client);
}
{
Console.WriteLine("Waiting for connection");
//Объект AcceptTcpClient ждет соединения с клиентом
TcpClient client = listener.AcceptTcpClient();
//Запустить новый поток выполнения для обработки этого соединения, чтобы иметь
//возможность вернуться к ожиданию очередного соединения
Thread thread = new Thread(new ParameterizedThreadStart(HandleClientThread));
thread.Start(client);
}
Так вот у вас и пример создания второго потока есть. Поток по английски thread. Нехорошо внутренности сервера по управлению формой размазывать. Лучше сделать для этого отдельный класс.
Спасибо, пока попробую сервер в консоли оставить, а формы только для визуальной работы с базой использовать.