Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
 Аватар для maks_IQ
21 / 21 / 1
Регистрация: 05.01.2011
Сообщений: 173

Как создать простенькое клиент-серверное приложение

02.07.2011, 22:55. Показов 3895. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
вобщем такая задача: создать простенькое клиентское и серверное приложение, чтобы с клиента можно было авторизовываться на сервере, и тд и тп.

по шагам:
1.в клиенте вводим имя пользователя
2.туда же вводим пароль
3.вводим адрес сервера (можно и без этого, для начала по localhost)
4.вводим порт к которому коннектимся (тоже можно пока выкинуть)

дальше я в теме плаваю, так что если не так понимаю - поправьте.
5.в клиенте my_socket.Connect(ip,port) - на сервере server_socket.bind(ip,port); server_socket.listen(10);
6.клиент send(имя пользователя) - сервер receive(имя пользователя)
7.клиент send(pass) - сервер receive(pass)
8.далее сервер проверяет логин и пароль и отсылает в клиент данные о прохождении авотризации

9.если зашли - в клиенте вводим текст, тот отсылается на сервер и присылается обратно
10. принимаем текст.

вроде бы легкая задачка, а при проверке и в клиенте и в сервере пишет вот что:

ArgumentNullException : System.ArgumentNullException: Значение не может быть нео
пределенным.
причем, в клиенте ошибка в строке 53, в сервере - 36.

А вот и собственно сам код:
Клиент
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
 
namespace Client_1
{
    class Program
    {
        public static string userName;
        public static byte[] userName_byte;
        public static string passWord;
        public static byte[] passWord_byte;
        public static string server_addr;
        public static int server_port;
        public static byte[] auth;
        public static byte[] msgSent;
        public static byte[] msgRec;
 
        public static void Auth()
        {
            Console.Write("Username: ");
            userName = Console.ReadLine();
            userName_byte = Encoding.ASCII.GetBytes(userName);
            Console.Write("\nPassword: ");
            passWord = Console.ReadLine();
            passWord_byte = Encoding.ASCII.GetBytes(passWord);
            Console.Write("\nServer (type 0 to connect to localhost): ");
            server_addr = Console.ReadLine();
            if (server_addr == "0")
            {
                server_addr = "127.0.0.1";
            }
            Console.Write("\nPort (type 0 to use default): ");
            server_port = Convert.ToInt32(Console.ReadLine());
            if (server_port == 0)
            {
                server_port = 2012;
            }
        }
        
        public static void StartClient()
        {
            Auth();
            IPHostEntry iphostinfo = Dns.Resolve(Dns.GetHostName());
            IPAddress ipAddress = iphostinfo.AddressList[0];
            IPEndPoint EndPoint = new IPEndPoint(ipAddress, 2012);
            Socket sender_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                sender_socket.Connect(EndPoint);
                int bytesSentUsrName = sender_socket.Send(userName_byte);
                int bytesSentPassWrd = sender_socket.Send(passWord_byte);
                int bytesRecAuth = sender_socket.Receive(auth);
                if (Encoding.ASCII.GetString(auth,0,bytesRecAuth) != "OK")
                {
                    Console.WriteLine("Auathorisation failed, closing programm");
                    Disconnecting(sender_socket);
                    return;
 
                }
                else
                {
                    Console.WriteLine("{1} has successfully connected to {0}", server_addr, userName);
                    while (true)
                    {
                        string cons;
                        Console.Write("   You: "); cons = Console.ReadLine();
                        if (cons != "EXIT")
                        {
                            msgSent = Encoding.ASCII.GetBytes(cons);
                            int bytesSentMsg = sender_socket.Send(msgSent);
                            int bytesRecMsg = sender_socket.Receive(msgRec);
                            Console.Write("Server: {0}", Encoding.ASCII.GetString(msgRec,0,bytesRecMsg));
                        }
                        else
                        {
                            Disconnecting(sender_socket);
                            return;
                        }
 
                    }
 
                }
 
            }
            catch (ArgumentNullException ane)
            {
                Console.WriteLine("ArgumentNullException : {0}", ane.ToString());
            }
            catch (SocketException se)
            {
                Console.WriteLine("SocketException : {0}", se.ToString());
            }
            catch (Exception e)
            {
                Console.WriteLine("Unexpected exception : {0}", e.ToString());
            }
        }
        public static void Disconnecting(Socket socket)
        {
            socket.Shutdown(SocketShutdown.Both);
            socket.Close();
        }
 
 
        public static int Main(String[] args)
        {
            StartClient();
            return 0;
        }
    }
}


Сервер
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
 
namespace Server_1
{
    class Program
    {
        public static string userName;
        public static byte[] userName_byte;
        public static string passWord;
        public static byte[] passWord_byte;
        public static string server_addr;
        public static int server_port;
        public static byte[] auth;
        public static byte[] msgSent;
        public static byte[] msgRec;
        public static string msgRec_str;
 
        public static void Listener()
        {
            IPHostEntry iphostinfo = Dns.Resolve(Dns.GetHostName());
            IPAddress ipAddress = iphostinfo.AddressList[0];
            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 2012);
            Socket listener_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                listener_socket.Bind(localEndPoint);
                listener_socket.Listen(10);
                while (true)
                {
                    Console.WriteLine("Waiting for Connections...");
                    Socket handler = listener_socket.Accept();
                    while (true)
                    {//тут будет авторизация
                        int UsrnameBytesRec = handler.Receive(userName_byte);
                        userName = Encoding.ASCII.GetString(userName_byte,0,UsrnameBytesRec);
                        ///////////////////////////////////////////////////
                        int PassBytesRec = handler.Receive(passWord_byte);
                        passWord = Encoding.ASCII.GetString(passWord_byte,0,PassBytesRec);
                        ///////////////////////////////////////////////
                        if (userName == "admin" && passWord == "admin")
                        {
                            handler.Send(Encoding.ASCII.GetBytes("OK"));
                            Console.WriteLine("{0} has successfully logged in", userName);
                        }
                        else
                        {
                            handler.Send(Encoding.ASCII.GetBytes("not OK"));
                            Console.WriteLine("User {0} has tried to log in with password {1}",userName,passWord);
                            break;
                        }
 
                        while (true)
                        {
                            //а тут будет обработка сообщений от клиента
                            int MsgRbytes = handler.Receive(msgRec); msgRec_str = Encoding.ASCII.GetString(msgRec,0,MsgRbytes);
                            Console.WriteLine("{0} says: {1}", userName, msgRec_str);
                            msgSent = Encoding.ASCII.GetBytes("You've said: \"" + msgRec_str + "\"");
                            handler.Send(msgSent);
                        }
 
                    }
 
 
 
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
        static int Main(string[] args)
        {
            Listener();
            return 0;
        }
    }
}

Надеюсь на хоть какую-то помощь или коментарии
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.07.2011, 22:55
Ответы с готовыми решениями:

Клиент-серверное приложение: как определить, что сервер/клиент не отвечает в течении определенного времени
Пишу клиент-серверное приложение. Использую TCPListener и TCPClient. Вопрос: как определить что сервер(клиент) не отвечает в течении...

Создать клиент-серверное приложение для трансляции картинки с web камеры
Доброго денечка :) Есть проект с подключением web камеры с использовавшем библиотеки AForge. Все хорошо камера врубается, картинка...

Как организовать клиент-серверное приложение
Делаю лабораторную: необходимо написать три приложения на с#, два сервера (ServerInput и ServerProcess) и клиент-приложение (ClientOutput)....

2
2 / 2 / 2
Регистрация: 23.01.2011
Сообщений: 43
05.07.2011, 18:17
Цитата Сообщение от maks_IQ Посмотреть сообщение
sender_socket.Connect(EndPoint); int bytesSentUsrName = sender_socket.Send(userName_byte); int bytesSentPassWrd = sender_socket.Send(passWord_byte); int bytesRecAuth = sender_socket.Receive(auth);
Замените этот код и подобный, что бы при отправке и получении было подобное тогда будет получать и принимать без проблем)
C#
1
2
3
4
5
6
7
8
9
10
 
//..........................//
                        userName_byte=new byte [handler.Available];
                        handler.Receive(userName_byte);
                        userName = Encoding.ASCII.GetString(userName_byte);
                  
                        passWord_byte = new byte[handler.Available];
                        handler.Receive(passWord_byte);
                        passWord = Encoding.ASCII.GetString(passWord_byte);
                        ///////////////////////////////////////////////
1
19 / 34 / 11
Регистрация: 09.10.2010
Сообщений: 420
06.03.2012, 14:19
kapitaneo,
C#
1
2
userName_byte=new byte [handler.Available];
                        handler.Receive(userName_byte);
у меня userName_byte в ноль обращается, так как объявлен до получения самого сообщения. Или я не так делаю?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.03.2012, 14:19
Помогаю со студенческими работами здесь

Как написать клиент-серверное приложение
Привет всем, хочу написать сервер.Пересмотрел кучу уроков и статей и т.д. ,но там нет подробного описания каждого класса и метода. Т.е. они...

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

Клиент-Серверное приложение: как отсоединиться от сервера
Клиент на C# Сервер на ANSI-C Сервер подаёт структуры размером в 38байт. Клиент Получает Байты и чз BitConverter я получаю свои...

Как написать клиент-серверное приложение для управления COM портом
Здравствуйте, Написал в Visual Studio 2010 программу для работы с COM портом - отправка команд(байтов) на микроконтроллер подключенный к...

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru