forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   С# (http://forum.boolean.name/forumdisplay.php?f=128)
-   -   Сетевое программирование (http://forum.boolean.name/showthread.php?t=18674)

Okay 02.11.2013 23:57

Сетевое программирование
 
Нашел в интернете пример Клиент-Сервера.
Все работает, понял как работает подключение к серверу, но не знаю как делать проверку на подключение =)

Код сервера
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();
}
}

pax 03.11.2013 00:24

Ответ: Сетевое программирование
 
Отличная статья по клиент-серверу на C#: http://msdn.microsoft.com/ru-ru/library/dd335942.aspx

Okay 04.11.2013 00:26

Ответ: Сетевое программирование
 
Цитата:

Сообщение от pax (Сообщение 269602)
Отличная статья по клиент-серверу на C#: http://msdn.microsoft.com/ru-ru/library/dd335942.aspx

Ну как бы статья не фонтан, я хочу сказать.
Статья для профессионалов, я к ним не отношусь, к сожалению...

Andvrok 04.11.2013 00:48

Ответ: Сетевое программирование
 
Цитата:

Сообщение от Okay (Сообщение 269625)
Ну как бы статья не фонтан, я хочу сказать.
Статья для профессионалов, я к ним не отношусь, к сожалению...

Ну хрен знает, на мой взгляд статья максимально простая, сомневаюсь что у тебя получится найти что-нибудь проще, разве что только в учебнике по программированию каком-то.

Okay 04.11.2013 01:41

Ответ: Сетевое программирование
 
Цитата:

Сообщение от Andvrok (Сообщение 269627)
Ну хрен знает, на мой взгляд статья максимально простая, сомневаюсь что у тебя получится найти что-нибудь проще, разве что только в учебнике по программированию каком-то.

Нашел =) На том же сайте, только не понимаю зачем при отправке сообщения серверу, требуется засылать строковую переменную в массив. Может быть кто знает?

string Message = Console.ReadLine();
Byte[] data = System.Text.Encoding.ASCII.GetBytes(Message);
NetworkStream stream = client.GetStream();
stream.Write(data, 0, data.Length);

pax 04.11.2013 09:55

Ответ: Сетевое программирование
 
Сервер передает байты, строка не байты а символы. Чтобы получить байты из строки, надо преобразовать строку какой-то кодировкой в байты. В твоем примере эта кодировка ASCII.

Okay 04.11.2013 18:27

Ответ: Сетевое программирование
 
Почему ошибка?



Класс клиента в юнити
Код:

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();
            }
        }
    }


pax 04.11.2013 20:20

Ответ: Сетевое программирование
 
а где функция Connected, которой предназначен мессадж? или ты просто забыл перед SendMessage написать client: client.SendMessage(connect )

Okay 04.11.2013 20:40

Ответ: Сетевое программирование
 
Цитата:

Сообщение от pax (Сообщение 269658)
а где функция Connected, которой предназначен мессадж? или ты просто забыл перед SendMessage написать client: client.SendMessage(connect )

Ооу, спасибо большое. Я что-то не досмотрел, что SendMessage используется как метод
Как бы отчет

Okay 05.01.2014 12:21

Ответ: Сетевое программирование
 
Значит есть код
Код:

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);

        }

Как сделать, чтобы отправлялось сообщение клиенту, который прислал сообщение на сервер?

pax 05.01.2014 13:13

Ответ: Сетевое программирование
 
вероятно надо выполнить отправку перед строкой
PHP код:

client.Close(); 


Okay 05.01.2014 14:26

Ответ: Сетевое программирование
 
Цитата:

Сообщение от pax (Сообщение 272187)
вероятно надо выполнить отправку перед строкой
PHP код:

client.Close(); 


Как все сложно. Лучше UDP тогда использовать

moka 05.01.2014 15:36

Ответ: Сетевое программирование
 
Ты ещё не начал сетевого программирования, а уже "сложно"..

DStalk 27.11.2015 01:18

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

PHP код:

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;



Andvrok 27.11.2015 02:35

Ответ: Сетевое программирование
 
Цитата:

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

PHP код:

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 стрима. В колбэке смотришь количество полученных байт - если больше нуля, то в стриме что-то есть.


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot