Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# для начинающих

Войти
Регистрация
Восстановить пароль
 
kllaid63
0 / 0 / 0
Регистрация: 15.01.2013
Сообщений: 92
#1

TCP - нарушается целостность данных при передаче - C#

10.07.2014, 21:04. Просмотров 511. Ответов 5
Метки нет (Все метки)

Всем привет.
В общем суть.
Есть клиент-сервер.
Серверу посылается запросу вида,
new like (id,tID,uID)
пример:
new like(312312,312312,312312)
все проходит отлично.
Затем в цикле, отправка 2 запроса.
Посылаю аналогичный запрос. Но выходит битым. т.е. выводил на консоль. приходит только "new"

скрин
TCP - нарушается целостность данных при передаче

серверный метод

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
private void SendError(TcpClient Client, string Str)
        {
            // Приведем строку к виду массива байт
            byte[] Buffer = Encoding.ASCII.GetBytes(Str);
            // Отправим его клиенту
            Client.GetStream().Write(Buffer, 0, Buffer.Length);
            // Закроем соединение
            Client.Close();
        }
 
public Client(TcpClient Client)
        {
            int ID = Server.TCount;
            Console.WriteLine("Client[" + ID + "] - Connected!");
            // Объявим строку, в которой будет хранится запрос клиента
            string Request = "";
            // Буфер для хранения принятых от клиента данных
            byte[] Buffer = new byte[1024];
            // Переменная для хранения количества байт, принятых от клиента
            int Count;
            // Читаем из потока клиента до тех пор, пока от него поступают данные
            try
            {
                while ((Count = Client.GetStream().Read(Buffer, 0, Buffer.Length)) > 0)
                {
                    // Преобразуем эти данные в строку и добавим ее к переменной Request
                    Request = Encoding.ASCII.GetString(Buffer, 0, Count);
                    Console.WriteLine(Request);
                    if(Request.Contains("new"))
                    {
                        try
                        {
                            int unixTime = (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
                            match = r1.Match(Request);
                            if(!match.Success)
                            {
                                Thread.Sleep(1000);
                                Buffer = Encoding.ASCII.GetBytes("302");
                                Client.GetStream().Write(Buffer, 0, Buffer.Length);
                                Console.WriteLine("302");
                            }
                            else
                            {
                                ExecuteQuery("INSERT INTO [task] (id_vk,type,tID,uID,time) VALUES (" + match.Groups[2].Value + ",\"" + match.Groups[1].Value + "\"," + match.Groups[3].Value + "," + match.Groups[4].Value + ", "+unixTime+")");
                                Buffer = Encoding.ASCII.GetBytes("200");
                                Thread.Sleep(1000);
                                Client.GetStream().Write(Buffer, 0, Buffer.Length);
                                Console.WriteLine("200");
                            }
                        }
                        catch
                        {
                            Buffer = Encoding.ASCII.GetBytes("100");
                            Client.GetStream().Write(Buffer, 0, Buffer.Length);
                            Console.WriteLine("100");
                        }
                    }
                    else if(Request.Contains("get"))
                    {
 
                    }
                    else if (Request.Contains("cancel"))
                    {
 
                    }
                    else
                    {
                        SendError(Client, "301");
                    }
                    Console.WriteLine(Request);
                    //LoadData(Request);
                }
            }
            catch
            {
                Server.Threads[ID].Abort();
            }
 
 
 
            
            Client.Close();
        }
Клиент
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
 
namespace TestClient
{
    class Program
    {
        static void Main(string[] args)
        {
            string data; // Юзерская дата
            byte[] remdata = { };
            TcpClient Client = new TcpClient();
            Console.Write("IP to connect to: ");
            string ip = Console.ReadLine();
            Console.Write("\r\nPort: ");
            int port = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("\r\nConnecting to server...");
            try
            {
                Client.Connect(ip, port);
            }
            catch
            {
                Console.WriteLine("Cannot connect to remote host!");
                return;
            }
            Console.Write("done\r\nTo end, type 'END'");
            Socket Sock = Client.Client;
            while (true)
            {
                Console.Write("\r\n>");
                data = Console.ReadLine();
                if (data == "END")
                    break;
                Sock.Send(System.Text.Encoding.ASCII.GetBytes(data));
                Sock.Receive(remdata);
                Console.Write("\r\n<" + System.Text.Encoding.ASCII.GetString(remdata));
            }
            Console.ReadKey();
            Sock.Close();
            Client.Close();
 
        }
    }
}
и еще вопрос. как в клиенте, отловить ответ от сервера

Добавлено через 2 часа 44 минуты
up!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2014, 21:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос TCP - нарушается целостность данных при передаче (C#):

Потеря данных при передаче по TCP - C#
Система сложная, отслеживает и записывает все происходящее. В итоге получается вот что: сервер отправляет пакет (условный фрагмент из байт)...

Ошибка при передаче изображения по TCP - C#
Ошибка при передаче изображения по TCP? Клиент: Bitmap printscreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width,...

Варьирование таймаута при передаче по TCP/IP - C#
Доброго дня! В общем есть задание, реализовать клиент серверное приложение, которое будет: 1. Передавать 32 кб информации,...

Проблема с объединением сообщений при передаче по TCP - C#
Вообщем делаю регистрацию и авторизацию клиента на сервере. Клиент: private void button1_Click(object sender, EventArgs e) { ...

Ошибка при передаче данных в GridView - C#
Среда: WPF Ошибка: Произошла ошибка базового поставщика в Open. Код: private void Window_Loaded(object sender,...

Детальная информация при передаче данных - C#
Ljudi nuzhno napisat progu kotoraja soedenitsja s serverom ip 111.111.111.1, port:80 , to est k portu browserov, i nuzhno videt na ekrane...

5
Wolfdp
503 / 492 / 59
Регистрация: 15.06.2012
Сообщений: 1,955
Записей в блоге: 1
11.07.2014, 12:29 #2
у вас принскрин консоли и код клиента явно разбегается.
C#
1
Console.Write("\r\n<" + System.Text.Encoding.ASCII.GetString(remdata));
Даже если бы ничего не пришло (а должно получить код ответа), то должно вывести закрывающую угловую скобку.
0
kllaid63
0 / 0 / 0
Регистрация: 15.01.2013
Сообщений: 92
11.07.2014, 14:51  [ТС] #3
не в этом причина. Я удалил эту строку. и сделал скрин. В чем мб проблема?
0
Wolfdp
503 / 492 / 59
Регистрация: 15.06.2012
Сообщений: 1,955
Записей в блоге: 1
11.07.2014, 14:59 #4
Цитата Сообщение от kllaid63 Посмотреть сообщение
не в этом причина. Я удалил эту строку. и сделал скрин. В чем мб проблема?
В том, что код дают один, а результаты показали для неведомо чего. Вот на серваке тоже вы явно что-то убирали, ибо код по идеи должен был вернуть код ошибки. =)

Попробуйте не получать каждый раз через Client.GetStream() нужный поток, а записать на старте цикла в переменную.
0
kllaid63
0 / 0 / 0
Регистрация: 15.01.2013
Сообщений: 92
11.07.2014, 15:00  [ТС] #5
удаленная строка, не меняет смысл.
а за идею. спасибо
0
Wolfdp
503 / 492 / 59
Регистрация: 15.06.2012
Сообщений: 1,955
Записей в блоге: 1
11.07.2014, 15:01 #6
Цитата Сообщение от kllaid63 Посмотреть сообщение
удаленная строка, не меняет смысл.
смысл она может и не меняет, но т.к. мне крайне не хочется запускать всё это чудо у себя, я отталкиваюсь от выведенной информации.
0
11.07.2014, 15:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2014, 15:01
Привет! Вот еще темы с ответами:

.NET 4.x Ошибки при передаче данных между клиентом и сервером - C#
Всем привет. В прошлом году писал диплом в виде клиент-серверного приложения. В основу лёг первый попавшийся пример из просторов...

Сокеты: Ошибка при передаче данных от клиента к серверу - C#
Помогите, пожалуйста, уже месяц мучаюсь с этим клиент-сервером! Возникает ошибка в многопоточном серверном приложении - клиент принимает...

Некорректное отображение кириллицы при передаче данных от сервера клиенту - C#
Здравствуйте. ПИшу проект, в котором нужно передавать текст от сервера к клиенту и наоборот. возникла проблема... кодировка в...

Проблеммы при скрытом запуске дочерних окон сторонних приложений и передаче в них данных - C#
Посоветуйте пожалуйста, как решить следующую проблемму: из основой программы стартую стороннюю программу: Как обычно, в классе: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru