Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2020, 12:40   #1
Uchenik2
Новичок
Джуниор
 
Регистрация: 05.12.2020
Сообщений: 1
По умолчанию Разделить программу на две( server и client)c#

Помогите пожалуйста разделить эту программу на 2 части ( server'ную и client'скую).
Я сколько не пробовал получается чушь.(в основном убираются ссылки и пишут, что переменной не существует и т.п...)
Вот код:
Код:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;

namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
new Server(8999);
}
}

public class Server
{
TcpListener Listener;
public Server(int Port)
{
Listener = new TcpListener(IPAddress.Any, Port);

Listener.Start();

while (true)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(ClientThread), Listener.AcceptTcpClient());
}
}

static void ClientThread(Object StateInfo)
{
try
{
var client = new Client();
client.ClientRun((TcpClient)StateInfo);
}
catch
{
((TcpClient)StateInfo).Close();
}
}

~Server()
{
if (Listener != null)
{
Listener.Stop();
}
}
}

public class Client
{
const int MAX_LENGTH_HEADER = 8192;

private void SendError(TcpClient Client, int Code)
{
string CodeStr = Code.ToString() + " " + ((HttpStatusCode)Code).ToString();
string Html = "<html><body><h1>" + CodeStr + "</h1></body></html>";
string Str = "HTTP/1.1 " + CodeStr + "\nContent-type: text/html\nContent-Length:" + Html.Length.ToString() + "\n\n" + Html;
byte[] Buffer = Encoding.UTF8.GetBytes(Str);
Client.GetStream().Write(Buffer, 0, Buffer.Length);
Client.Close();
}

public void ClientRun(TcpClient Client)
{
WebClient client = new WebClient();
string IP = client.DownloadString("http://api.ipify.org");
Console.WriteLine("Подключение произошло по IP: " + IP);

Console.WriteLine("IP: " + "{1} : {0} Connect OK","Data: " + DateTime.Now, Client.Client.RemoteEndPoint.ToString());
Console.WriteLine("Порт" + ((IPEndPoint)Client.Client.RemoteEndPoint).Port.ToString());

string Request = "";
byte[] Buffer = new byte[8192];
int Count;
while ((Count = Client.GetStream().Read(Buffer, 0, Buffer.Length)) > 0)
{
Request += Encoding.UTF8.GetString(Buffer, 0, Count);

if (!Request.Contains("POST"))
{
if (Request.IndexOf("\r\n\r\n") >= 0 || Request.Length > MAX_LENGTH_HEADER)
{
//Console.WriteLine(string.Join("", Request.Split(' ').Take(2)));
break;
}
}
else
{
if (Request.Split(new string[] { "\r\n\r\n" }, StringSplitOptions.None).Count() > 1 || Request.Length > MAX_LENGTH_HEADER)
{
Console.WriteLine(string.Join("", Request.Split(' ').Take(2)));
break;
}
}
}

var RequestUri = Request.RegexParse(@"^\w+\s+([^\s]+)[^\s]*\s+HTTP/.*|").Split(' ').FirstOrDefault(x => x[0] == '/');

if (string.IsNullOrEmpty(RequestUri))
{
SendError(Client, 400);
return;
}

RequestUri = Uri.UnescapeDataString(RequestUri);

if (RequestUri.IndexOf("..") >= 0)
{
SendError(Client, 400);
return;
}

if (RequestUri.Length > 0)
{
var split = RequestUri.Split('?').ToList();

if (Request.Contains("POST"))
{
var postData = Request.Split(new string[] { "\r\n\r\n" }, StringSplitOptions.None);
split.Insert(1, postData[1]);
}

var resultString = "Hello "; //Формируем ответ

Encoding utf8 = Encoding.UTF8;

if (string.IsNullOrEmpty(resultString))
{
SendError(Client, 404);
return;
}

string Headers = "HTTP/1.1 200 OK\nContent-Type: text/html\nContent-Length: " + resultString.Length + "\n\n";
byte[] HeadersBuffer = Encoding.UTF8.GetBytes(Headers);
Client.GetStream().Write(HeadersBuffer, 0, HeadersBuffer.Length);
using (var reader = new MemoryStream(Encoding.UTF8.GetBytes(resultString.ToString())))
{
while (reader.Position < reader.Length)
{
Count = reader.Read(Buffer, 0, Buffer.Length);
Client.GetStream().Write(Buffer, 0, Count);
}
Client.Close();
}
}
Client.Close();
}
}

public static class ext
{
public static string RegexParse(this string data, string pattern)
{
var result = "";

var regex = new Regex(pattern);
if (regex.IsMatch(data)) result = regex.Match(data).ToString();

return result;
}
}
}

Последний раз редактировалось Uchenik2; 05.12.2020 в 12:49.
Uchenik2 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Server and Client АНАТОЛИЙ249 Общие вопросы Delphi 1 17.01.2017 20:18
Winsock Client Server fucil Работа с сетью в Delphi 10 06.09.2012 00:37
Доработка Client-Server werrey Работа с сетью в Delphi 5 03.09.2011 20:51
[c++] Client-Server: GET request refused by the server Pumych Помощь студентам 2 22.08.2010 23:36
Client и Server Роман Радер Работа с сетью в Delphi 11 10.07.2008 15:24