Просмотр полной версии : Нужна помощь с сокетами на C#
Написал я кое-что на пхп и мне понадобилось переписать под вин, пришлось осваивать сокеты на С#. В пхп сокеты - мегапросто, а вот в C# ну никак не могу разобраться с кучей возможных вариантов и т.д., кароче путаница полная в голове. Дело в том что я отлично знаю процедуру инициализации и использования сокета, мне нужен именно синтаксис, конкретный, рабочий, небольшой пример использования сокетов на C#, буквально коннект к яндексу, отправпа обчного заголовка и получение(вывод) контента. Выручайте...
ну может так, вот примерчик:
using System;
using System.Net;
class NetDemo
{
public static void Main()
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.penisbot.ru");
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
Stream istrm = resp.GetResponseStream();
/*теперь у нас в потоке код html-документа*/
...
незабудь закрыть поток resp.Close(); :cool:
ToniKapuchon
28.10.2008, 01:00
HttpWebRequest
WebRequest
почитай про ети два класса - будет тебе счастья!!
а ваще про сокеты на шарпе первый раз слышу...
12usver12
28.10.2008, 11:21
проще чем в шарпе уже некуда
WebClient wc = new WebClient();
wc.DownloadFile("yandex.ru","C:\\1.html");
// а потом Streamreader работать
а можно не сохраняя на диск, в память
HttpWebRequest webRequest =(HttpWebRequest)WebRequest.Create("http://rambler.ru");
HttpWebResponse WebResponse = (HttpWebResponse)webRequest.GetResponse();
StreamReader streamReader = new StreamReader(WebResponse.GetResponseStream(),Encod ing.GetEncoding(1251));
string source = streamReader.ReadToEnd();
streamReader.Close();
http://www.java2s.com/Tutorial/CSharp/0580__Network/Catalog0580__Network.htm
омг, ToniKapuchon сколько работаешь с шарпом, да вообще с .NET?
выше указанные классы, это просто оболочки сокетов.
автор, как вариант можно тупо подгружать библиотеки. Атрибут DllImport (если мне память не изменяет)
P.S. вот же народ любит код дублировать, типа есть отличия.
А как отправить обычный заголовок? Я попытался подобным образом:
public static void Main()
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://yandex.ru");
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
StreamReader sr = new StreamReader(resp.GetResponseStream(), Encoding.GetEncoding(1251));
StreamWriter sw = new StreamWriter(req.GetRequestStream(), Encoding.GetEncoding(1251));
sw.Write("GET / HTTP/1.0\r\nAccept: */*\r\nAccept-Language: ru\r\nUA-CPU: x86\r\nHost: yandex.ru\r\nConnection: Keep-Alive\r\n\r\n");
string source = sr.ReadToEnd();
Console.WriteLine(source);
sr.Close();
sw.Close();
Console.ReadLine();
}
Пишет ошибку в потоке стримрайтера...
Все, нашел, очень полезная статья: _http://www.gotdotnet.ru/LearnDotNet/NETFramework/491563.aspx
12usver12
29.10.2008, 01:07
я ж тебе дал готовый кусок кода, который это все дело выполняет тока без использования httpheaders но они в даном случае и не нужны, да и еще для отображения русских букв используй кодировку utf-8
Можно узнать как в C#, в консольном приложении реализовать вывод(изменения) переменных в реальном времени. То есть, например, в консоль вывел две строки:
Бэд :
Гуд :
после двоиточий по идее должны стоять переменные, которые в процессе работы программы естественно будут изменяться. Так вот, как осуществить подобный вывод?
vikseriq
31.10.2008, 19:51
Так и осуществить:
Console.WriteLine("{0}: {1}", "GOOD", a);
Console.WriteLine("{0}: {1}", "BAD", b);
vikseriq
31.10.2008, 19:54
Ааа, типа понял.. Тогда перерисовывай окно )
Товарищи, я тоже не знаю:
Как в консольном приложении менять определенное значение на выводе? Ну, типа как это: "Загрузка x%. Подождите". Как этот x менять?
vikseriq
31.10.2008, 20:34
не спасло.
Вопрос на счет "активной" переменной, еще актуален... А пока еще один, например мне надо проверить проксину на работоспособность, перед использованием, как проще всего это зделать? Инициализировать для этого сокеты, а в C# это меганеудобно, думаю будет глупо.
vikseriq
31.10.2008, 21:41
Читай этот топик, ллол ))
А как юзать прокси в СиШарпе ?
12usver12
31.10.2008, 21:56
в классе WebRequest есть свойство proxy , пробуй посылать запрос на скачку ya.ru, если есть ответный поток то проксик гуд
vikseriq
31.10.2008, 22:19
А как в VB заюзать прокси? :)
не спасло.
http://msdn.microsoft.com/en-us/library/ms686025(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms686025(VS.85).aspx
Приведи примерчик пожалуйсто, если не сложно?!
ЗЫ по ссылке способы на С++, а мы обсуждаем C#!
Инициализировать для этого сокеты, а в C# это меганеудобно, думаю будет глупо.
Да уж, меганеудобно :D :D
using System;
using System.Net;
using System.IO;
using System.Net.Sockets;
using System.Text;
class SimplestWebBrowser
{
[STAThread]
static void Main(string[] args)
{
Console.Write("Enter URL (for example http://google.com ):");
string URL = Console.ReadLine();
//парсим
string[] parts = URL.Split(new char[]{'/'}, 4);
if(parts.Length<3)
throw new Exception ("Bad URL");
string host = parts[2];
//открываем сокет
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(host, 80);
//отправляем запрос
byte[] buffer = Encoding.Default.GetBytes(
string.Format(
@"GET /{0} HTTP/1.0
Host: {1}
", parts.Length>3?parts[3]:"", host));
socket.Send(buffer);
//принимаем ответ
byte[] recBuffer = new byte[4096];//принмаем максимум 4 кб за раз
string answer = "";
int recCount;
do
{
recCount = socket.Receive(recBuffer);
//перобразуем в ASCII
answer += Encoding.Default.GetString(recBuffer, 0, recCount);
} while (recCount > 0);
//скажем серверу пока
socket.Close();
//покажем ответ
Console.WriteLine(answer);
Console.ReadLine();
}
}
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot