|
С# Средство разработки на платформе .Net |
02.11.2013, 23:57
|
#1
|
Знающий
Регистрация: 21.11.2011
Сообщений: 284
Написано 17 полезных сообщений (для 74 пользователей)
|
Сетевое программирование
Нашел в интернете пример Клиент-Сервера.
Все работает, понял как работает подключение к серверу, но не знаю как делать проверку на подключение =)
Код сервера
static void Main(string[] args)
{
TcpListener listner = new TcpListener(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12000));
listner.Start();
while (true)
{
TcpClient client = listner.AcceptTcpClient();
StreamReader sr = new StreamReader(client.GetStream());
Console.WriteLine("Client : " + sr.ReadLine());
StreamWriter sw = new StreamWriter(client.GetStream());
sw.AutoFlush = true;
Console.WriteLine("Server : Привет");
sw.WriteLine("Привет");
Console.WriteLine("Client : " + sr.ReadLine());
Console.WriteLine("Server : Пока");
sw.WriteLine("Пока");
client.Close();
}
}
|
(Offline)
|
|
03.11.2013, 00:24
|
#2
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Сетевое программирование
|
(Offline)
|
|
04.11.2013, 00:26
|
#3
|
Знающий
Регистрация: 21.11.2011
Сообщений: 284
Написано 17 полезных сообщений (для 74 пользователей)
|
Ответ: Сетевое программирование
Сообщение от pax
|
Ну как бы статья не фонтан, я хочу сказать.
Статья для профессионалов, я к ним не отношусь, к сожалению...
|
(Offline)
|
|
04.11.2013, 00:48
|
#4
|
Бывалый
Регистрация: 26.07.2009
Сообщений: 785
Написано 362 полезных сообщений (для 995 пользователей)
|
Ответ: Сетевое программирование
Сообщение от Okay
Ну как бы статья не фонтан, я хочу сказать.
Статья для профессионалов, я к ним не отношусь, к сожалению...
|
Ну хрен знает, на мой взгляд статья максимально простая, сомневаюсь что у тебя получится найти что-нибудь проще, разве что только в учебнике по программированию каком-то.
|
(Offline)
|
|
04.11.2013, 01:41
|
#5
|
Знающий
Регистрация: 21.11.2011
Сообщений: 284
Написано 17 полезных сообщений (для 74 пользователей)
|
Ответ: Сетевое программирование
Сообщение от Andvrok
Ну хрен знает, на мой взгляд статья максимально простая, сомневаюсь что у тебя получится найти что-нибудь проще, разве что только в учебнике по программированию каком-то.
|
Нашел =) На том же сайте, только не понимаю зачем при отправке сообщения серверу, требуется засылать строковую переменную в массив. Может быть кто знает?
string Message = Console.ReadLine();
Byte[] data = System.Text.Encoding.ASCII.GetBytes(Message);
NetworkStream stream = client.GetStream();
stream.Write(data, 0, data.Length);
|
(Offline)
|
|
04.11.2013, 09:55
|
#6
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Сетевое программирование
Сервер передает байты, строка не байты а символы. Чтобы получить байты из строки, надо преобразовать строку какой-то кодировкой в байты. В твоем примере эта кодировка ASCII.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
04.11.2013, 18:27
|
#7
|
Знающий
Регистрация: 21.11.2011
Сообщений: 284
Написано 17 полезных сообщений (для 74 пользователей)
|
Ответ: Сетевое программирование
Почему ошибка?
Класс клиента в юнити
public class Test : MonoBehaviour {
Client client;
// Use this for initialization
void Start ()
{
string connect = "Connected";
client = new Client("127.0.0.1", 12000);
SendMessage(connect);
}
// Update is called once per frame
void Update () {
}
}
Класс клиента в C#
class Client
{
TcpClient client;
public Client(string IpAdress, int port)
{
client = new TcpClient(IpAdress, port);
}
public void SendMessage(string Message)
{
Message.Trim();
Byte[] data = System.Text.Encoding.ASCII.GetBytes(Message);
NetworkStream stream = client.GetStream();
stream.Write(data, 0, data.Length);
}
}
Класс сервера
class Program
{
static void Main(string[] args)
{
TcpListener listner = new TcpListener(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12000));
listner.Start();
Byte[] bytes = new Byte[256];
String data = null;
while (true)
{
TcpClient client = listner.AcceptTcpClient();
Console.WriteLine("Подключился клиент");
data = null;
NetworkStream stream = client.GetStream();
stream.Read(bytes, 0, bytes.Length);
data = System.Text.Encoding.ASCII.GetString(bytes, 0, data.Length);
Console.WriteLine("Received: {0}", data);
client.Close();
}
}
}
|
(Offline)
|
|
04.11.2013, 20:20
|
#8
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Сетевое программирование
а где функция Connected, которой предназначен мессадж? или ты просто забыл перед SendMessage написать client: client.SendMessage(connect )
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
04.11.2013, 20:40
|
#9
|
Знающий
Регистрация: 21.11.2011
Сообщений: 284
Написано 17 полезных сообщений (для 74 пользователей)
|
Ответ: Сетевое программирование
Сообщение от pax
а где функция Connected, которой предназначен мессадж? или ты просто забыл перед SendMessage написать client: client.SendMessage(connect )
|
Ооу, спасибо большое. Я что-то не досмотрел, что SendMessage используется как метод
Как бы отчет
|
(Offline)
|
|
05.01.2014, 12:21
|
#10
|
Знающий
Регистрация: 21.11.2011
Сообщений: 284
Написано 17 полезных сообщений (для 74 пользователей)
|
Ответ: Сетевое программирование
Значит есть код
static void Main(string[] args)
{
TcpListener listner = new TcpListener(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12000));
listner.Start();
Byte[] bytes = new Byte[256];
String data = null;
while (true)
{
TcpClient client = listner.AcceptTcpClient();
Console.WriteLine("Подключился клиент");
data = null;
NetworkStream stream = client.GetStream();
stream.Read(bytes, 0, bytes.Length);
data = System.Text.Encoding.ASCII.GetString(bytes, 0, bytes.Length);
Console.WriteLine("Received: {0}", data);
client.Close();
}
}
public void SendMessage(string Message)
{
Message.Trim();
Byte[] data = System.Text.Encoding.ASCII.GetBytes(Message);
NetworkStream stream = client.GetStream();
stream.Write(data, 0, data.Length);
}
Как сделать, чтобы отправлялось сообщение клиенту, который прислал сообщение на сервер?
|
(Offline)
|
|
05.01.2014, 13:13
|
#11
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Сетевое программирование
вероятно надо выполнить отправку перед строкой
|
(Offline)
|
|
05.01.2014, 14:26
|
#12
|
Знающий
Регистрация: 21.11.2011
Сообщений: 284
Написано 17 полезных сообщений (для 74 пользователей)
|
Ответ: Сетевое программирование
Сообщение от pax
вероятно надо выполнить отправку перед строкой
|
Как все сложно. Лучше UDP тогда использовать
|
(Offline)
|
|
05.01.2014, 15:36
|
#13
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Сетевое программирование
Ты ещё не начал сетевого программирования, а уже "сложно"..
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
27.11.2015, 01:18
|
#14
|
Разработчик
Регистрация: 27.06.2009
Адрес: Рязань-Москва
Сообщений: 471
Написано 401 полезных сообщений (для 1,072 пользователей)
|
Ответ: Сетевое программирование
Товарищи, подскажите: имеется простенький клиент. В цикле вызывается readSocket(), для проверки доступных данных для чтения используется NetworkStream.DataAvailable. Читать данные удобнее именно строками, но для этих целей явно не подходит DataAvailable - иногда данные "висят" до следующей строки (одна строчка прочиталась из потока, DataAvailable сбросилось, следующая строка не читается пока новая не придет).
Гуглил, но решения именно с ReadLine() не нашел, может кто подскажет как по другому сделать проверку на пришедшие данные?
tcp_socket = new TcpClient(host, port); net_stream = tcp_socket.GetStream(); socket_writer = new StreamWriter(net_stream); socket_reader = new StreamReader(net_stream); static public Boolean readSocket() { if (net_stream.DataAvailable) { tcp_packet = socket_reader.ReadLine(); //Тут обработка return true; } return false; }
|
(Offline)
|
|
27.11.2015, 02:35
|
#15
|
Бывалый
Регистрация: 26.07.2009
Сообщений: 785
Написано 362 полезных сообщений (для 995 пользователей)
|
Ответ: Сетевое программирование
Сообщение от DStalk
Товарищи, подскажите: имеется простенький клиент. В цикле вызывается readSocket(), для проверки доступных данных для чтения используется NetworkStream.DataAvailable. Читать данные удобнее именно строками, но для этих целей явно не подходит DataAvailable - иногда данные "висят" до следующей строки (одна строчка прочиталась из потока, DataAvailable сбросилось, следующая строка не читается пока новая не придет).
Гуглил, но решения именно с ReadLine() не нашел, может кто подскажет как по другому сделать проверку на пришедшие данные?
tcp_socket = new TcpClient(host, port); net_stream = tcp_socket.GetStream(); socket_writer = new StreamWriter(net_stream); socket_reader = new StreamReader(net_stream); static public Boolean readSocket() { if (net_stream.DataAvailable) { tcp_packet = socket_reader.ReadLine(); //Тут обработка return true; } return false; }
|
Не совсем понял задачу. Я обычно пользуюсь не ридером, а BeginRead/BeginReadAsync стрима. В колбэке смотришь количество полученных байт - если больше нуля, то в стриме что-то есть.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:29.
|