Научно-образовательный IT-форум при КНИТУ-КАИ

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Научно-образовательный IT-форум при КНИТУ-КАИ » Задачи и вопросы » [+] Задачка для любителей программирования C#


[+] Задачка для любителей программирования C#

Сообщений 1 страница 10 из 13

1

ИСХОДНЫЕ ДАННЫЕ:
Имеются две программы обмена сообщениями Сервер и Клиент:

using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;

namespace Server
{
    class Program
    {
        static void Main(string[] args)
        {
            TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 5001);
            listener.Start();
            TcpClient tc = listener.AcceptTcpClient();
            NetworkStream stm = tc.GetStream();
            byte[] msg = new byte[20];
            stm.Read(msg, 0, 20);
            Console.WriteLine(Encoding.ASCII.GetString(msg));
            stm.Write(Encoding.ASCII.GetBytes("Message from server."), 0, 20);
            stm.Close();
            tc.Close();
        }
    }
}


using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            TcpClient client = new TcpClient();
            client.Connect("127.0.0.1", 5001);
            NetworkStream stm = client.GetStream();
            stm.Write(Encoding.ASCII.GetBytes("Message from client."), 0, 20);
            byte[] msg = new byte[20];
            stm.Read(msg,0,20);
            Console.WriteLine(Encoding.ASCII.GetString(msg));
            stm.Close();
            client.Close();
        }
    }
}


ВОПРОС:
Как организовать прием/передачу сообщений между сервером и клиентом с использованием StreamReader.ReadLine()/StreamWriter.WriteLine(), если длина сообщений заведомо не известна?

2

Есть пример udpbroadcast-a,там явно размер сообщений(принятых  и отправленных) не задается.Правда нет там и StreamReader.ReadLine()/StreamWriter.WriteLine().

3

Богданур написал(а):

Есть пример udpbroadcast-a,там явно размер сообщений(принятых  и отправленных) не задается.Правда нет там и StreamReader.ReadLine()/StreamWriter.WriteLine().

Богданур, попробую другую реализацию. Интересно увидеть.

4

Если нужно,то могу прислать исходники(для личного пользования)

5

Посмотрел бы, спасибо!

6

Незамысловата реализация с применением Socket:

SERVER

using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;

namespace Server
{
    class Program
    {
        static void Main(string[] args)
        {
            TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 5001);
            listener.Start();
            Socket tc = listener.AcceptSocket();
            byte[] bytes = new byte[1024];
            tc.Receive(bytes);
            string msg = Encoding.ASCII.GetString(bytes);
            Console.WriteLine(msg.Remove(msg.IndexOf("\0")));
            tc.Send(Encoding.ASCII.GetBytes("Message from server."));
            tc.Close();
        }
    }
}


CLIENT

using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            client.Connect("127.0.0.1", 5001);
            client.Send(Encoding.ASCII.GetBytes("Message from client."));
            byte[] bytes = new byte[1024];
            client.Receive(bytes);
            string msg = Encoding.ASCII.GetString(bytes);
            Console.WriteLine(msg.Remove(msg.IndexOf("\0")));
            client.Close();
        }
    }
}


А попробуйте реализовать с применением StreamReader.ReadLine()/StreamWriter.WriteLine(). ;)

7

Просится реализация такого плана:

SERVER:

using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;

namespace Server
{
    class Program
    {
        static void Main(string[] args)
        {
            TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 5001);
            listener.Start();
            Socket tc = listener.AcceptSocket();
            NetworkStream s = new NetworkStream(tc);
            StreamReader sr = new StreamReader(s);
            string msg = sr.ReadLine();
            Console.WriteLine(msg);
            StreamWriter sw = new StreamWriter(s);
            sw.WriteLine("Message from server.");
            s.Close();
            tc.Close();
        }
    }
}


CLIENT:

using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            client.Connect("127.0.0.1", 5001);
            NetworkStream s = new NetworkStream(client);
            StreamWriter sw = new StreamWriter(s);
            sw.WriteLine("Message from client.");
            StreamReader sr = new StreamReader(s);
            string msg = sr.ReadLine();
            Console.WriteLine(msg);
            s.Close();
            client.Close();
        }
    }
}


Но она работать не будет, догадайтесь почему и попробуйте предложить верную реализацию.

8

Не понятно зачем NetworkStream,если сокеты могут сами отправлять и принимать сообщения?
Почему не работает?Я думаю из-за того что для сокетов надо установить конечные локальние точки

9

Согласен, Богданур, NetworkStream ни к чему. Но так поставлена задача, поэтому применение StreamReader/StreamWriter порождает избыточность.

10

Богданур написал(а):

Я думаю из-за того что для сокетов надо установить конечные локальние точки

Сомневаюсь. :)


Вы здесь » Научно-образовательный IT-форум при КНИТУ-КАИ » Задачи и вопросы » [+] Задачка для любителей программирования C#