Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > С#

С# Средство разработки на платформе .Net

Ответ
 
Опции темы
Старый 02.11.2013, 23:57   #1
Okay
Знающий
 
Регистрация: 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
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Сетевое программирование

Отличная статья по клиент-серверу на C#: http://msdn.microsoft.com/ru-ru/library/dd335942.aspx
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 04.11.2013, 00:26   #3
Okay
Знающий
 
Регистрация: 21.11.2011
Сообщений: 284
Написано 17 полезных сообщений
(для 74 пользователей)
Ответ: Сетевое программирование

Сообщение от pax Посмотреть сообщение
Отличная статья по клиент-серверу на C#: http://msdn.microsoft.com/ru-ru/library/dd335942.aspx
Ну как бы статья не фонтан, я хочу сказать.
Статья для профессионалов, я к ним не отношусь, к сожалению...
(Offline)
 
Ответить с цитированием
Старый 04.11.2013, 00:48   #4
Andvrok
Бывалый
 
Регистрация: 26.07.2009
Сообщений: 785
Написано 362 полезных сообщений
(для 995 пользователей)
Ответ: Сетевое программирование

Сообщение от Okay Посмотреть сообщение
Ну как бы статья не фонтан, я хочу сказать.
Статья для профессионалов, я к ним не отношусь, к сожалению...
Ну хрен знает, на мой взгляд статья максимально простая, сомневаюсь что у тебя получится найти что-нибудь проще, разве что только в учебнике по программированию каком-то.
(Offline)
 
Ответить с цитированием
Старый 04.11.2013, 01:41   #5
Okay
Знающий
 
Регистрация: 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
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Сетевое программирование

Сервер передает байты, строка не байты а символы. Чтобы получить байты из строки, надо преобразовать строку какой-то кодировкой в байты. В твоем примере эта кодировка ASCII.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Okay (04.11.2013)
Старый 04.11.2013, 18:27   #7
Okay
Знающий
 
Регистрация: 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
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Сетевое программирование

а где функция Connected, которой предназначен мессадж? или ты просто забыл перед SendMessage написать client: client.SendMessage(connect )
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Okay (04.11.2013)
Старый 04.11.2013, 20:40   #9
Okay
Знающий
 
Регистрация: 21.11.2011
Сообщений: 284
Написано 17 полезных сообщений
(для 74 пользователей)
Ответ: Сетевое программирование

Сообщение от pax Посмотреть сообщение
а где функция Connected, которой предназначен мессадж? или ты просто забыл перед SendMessage написать client: client.SendMessage(connect )
Ооу, спасибо большое. Я что-то не досмотрел, что SendMessage используется как метод
Как бы отчет
(Offline)
 
Ответить с цитированием
Старый 05.01.2014, 12:21   #10
Okay
Знающий
 
Регистрация: 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
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Сетевое программирование

вероятно надо выполнить отправку перед строкой
client.Close(); 
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 05.01.2014, 14:26   #12
Okay
Знающий
 
Регистрация: 21.11.2011
Сообщений: 284
Написано 17 полезных сообщений
(для 74 пользователей)
Ответ: Сетевое программирование

Сообщение от pax Посмотреть сообщение
вероятно надо выполнить отправку перед строкой
client.Close(); 
Как все сложно. Лучше UDP тогда использовать
(Offline)
 
Ответить с цитированием
Старый 05.01.2014, 15:36   #13
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Сетевое программирование

Ты ещё не начал сетевого программирования, а уже "сложно"..
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Andvrok (24.04.2015)
Старый 27.11.2015, 01:18   #14
DStalk
Разработчик
 
Аватар для DStalk
 
Регистрация: 27.06.2009
Адрес: Рязань-Москва
Сообщений: 471
Написано 401 полезных сообщений
(для 1,072 пользователей)
Ответ: Сетевое программирование

Товарищи, подскажите: имеется простенький клиент. В цикле вызывается readSocket(), для проверки доступных данных для чтения используется NetworkStream.DataAvailable. Читать данные удобнее именно строками, но для этих целей явно не подходит DataAvailable - иногда данные "висят" до следующей строки (одна строчка прочиталась из потока, DataAvailable сбросилось, следующая строка не читается пока новая не придет).
Гуглил, но решения именно с ReadLine() не нашел, может кто подскажет как по другому сделать проверку на пришедшие данные?

tcp_socket = new TcpClient(hostport);
            
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;

__________________
galaxies.su | dstalk.ru
(Offline)
 
Ответить с цитированием
Старый 27.11.2015, 02:35   #15
Andvrok
Бывалый
 
Регистрация: 26.07.2009
Сообщений: 785
Написано 362 полезных сообщений
(для 995 пользователей)
Ответ: Сетевое программирование

Сообщение от DStalk Посмотреть сообщение
Товарищи, подскажите: имеется простенький клиент. В цикле вызывается readSocket(), для проверки доступных данных для чтения используется NetworkStream.DataAvailable. Читать данные удобнее именно строками, но для этих целей явно не подходит DataAvailable - иногда данные "висят" до следующей строки (одна строчка прочиталась из потока, DataAvailable сбросилось, следующая строка не читается пока новая не придет).
Гуглил, но решения именно с ReadLine() не нашел, может кто подскажет как по другому сделать проверку на пришедшие данные?

tcp_socket = new TcpClient(hostport);
            
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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
DStalk (27.11.2015)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 12:08.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com