Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
10 / 10 / 0
Регистрация: 29.04.2013
Сообщений: 145

Chat-клиент, chat-сервер

18.10.2014, 21:02. Показов 2520. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Задача - написать чат-сервер и чат-клиент на сокетах. Клиент и сервер написал, но клиенты работаю, скажем так по очереди. Первый отсылает, за ним второй отсылает, сервер отсылает первому текст второго, второму - текст первого. Первый не может отослать 2,3,4 и т.д. сообщений подряд, так же как и второй не может отослать больше одного сообщения за раз второму. Честно, не знаю как понятней объяснить их работу, проще, наверное, скомпилировать и посмотреть. Вопрос в том, как уйти от этой проблемы? Собственно, сделать полноценный "живой" чат. Пробовал через Thread заставить клиент "ожидать" сообщения, но ничего не вышло. Сервер ожидает подключений, для каждого клиента создает свой поток. Так должно работать, вроде...

Клиент:
Кликните здесь для просмотра всего текста
C++ (Qt)
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
#pragma comment (lib,"Ws2_32.lib")
#include <WinSock2.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    WORD ver = MAKEWORD(2, 2);
    WSADATA wsaData;
    int retVal = 0;
 
    WSAStartup(ver, (LPWSADATA)&wsaData);
 
    LPHOSTENT hostEnt;
 
    hostEnt = gethostbyname("localhost");
 
    if (!hostEnt)
    {
        printf("Unable to collect gethostbyname\n");
        WSACleanup();
        system("pause");
        return 1;
    }
 
    SOCKET clientSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
 
    if (clientSock == SOCKET_ERROR)
    {
        printf("Unable to create socket\n");
        WSACleanup();
        system("pause");
        return 1;
    }
 
    string ip;
    cout << "ip>";
    cin >> ip;
    cin.ignore();
 
    SOCKADDR_IN serverInfo;
 
    serverInfo.sin_family = PF_INET;
    serverInfo.sin_addr.S_un.S_addr = inet_addr(ip.c_str());
    serverInfo.sin_port = htons(3114);
 
    retVal = connect(clientSock, (LPSOCKADDR)&serverInfo, sizeof(serverInfo));
 
    if (retVal == SOCKET_ERROR)
    {
        printf("Unable to connect\n");
        WSACleanup();
        system("pause");
        return 1;
    }
 
    printf("Connection made successfully\n");
    printf("Enter 'exit' to exit\n");
 
    char pBuf[256], exit[5];
 
    exit[0] = 'e';
    exit[1] = 'x';
    exit[2] = 'i';
    exit[3] = 't';
    exit[4] = '\0';
 
    while (true)
    {
        cout << ">";
        gets(pBuf);
 
        if (strcmp(pBuf, exit) == 0) break;
        else
        {
            //printf("Sending request from client\n");
 
            retVal = send(clientSock, pBuf, strlen(pBuf), 0);
 
            if (retVal == SOCKET_ERROR)
            {
                printf("Unable to send\n");
                WSACleanup();
                system("pause");
                return 1;
            }
 
            char szResponse[256];
 
            retVal = recv(clientSock, szResponse, 256, 0);
 
            if (retVal == SOCKET_ERROR)
            {
                printf("Unable to recv\n");
                WSACleanup();
                system("pause");
                return 1;
            }
 
            if (retVal > 0)
            {
                char *Resp;
                Resp = szResponse;
                printf("Server<%s\n", Resp);
            }
        }
    }
    closesocket(clientSock);
    WSACleanup();
    return 0;
}


Сервер:
Кликните здесь для просмотра всего текста
C++ (Qt)
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#pragma comment (lib,"Ws2_32.lib")
#include <WinSock2.h>
#include <stdio.h>
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
 
SOCKET servSock, usersList[2];
int usersCount = 0;
 
DWORD WINAPI work(LPVOID clientSocket)
{
    int retVal;
    char szReq[256];
    int exit;
    SOCKET clientSock;
 
    clientSock = *((SOCKET *)clientSocket);
 
    while (true)
    {
        retVal = recv(clientSock, szReq, 256, 0);
 
        if (retVal == 0)
        {
            printf("Client disconnected\n");
 
            closesocket(clientSock);
            printf("Connection closed\n");
 
            return SOCKET_ERROR;
        }
        if (retVal == SOCKET_ERROR)
        {
            printf("Unable to recv\n");
            //system("pause");
 
            closesocket(clientSock);
            printf("Connection closed\n");
 
            return SOCKET_ERROR;
        }
        else
        {
            szReq[retVal] = '\0';
        }
 
        printf("Data received\n");
 
        int i;
 
        printf("Client>%s\n", szReq);
        char szResp[256];
        sprintf(szResp, "%s", szReq);
 
        printf("Sending response from server\n");
 
        for (i = 0; i < usersCount; i++)
        {
            SOCKET tempSock;
 
            tempSock = usersList[i];
 
            if (tempSock != clientSock) retVal = send(tempSock, szResp, 256, 0);
        }
 
        if (retVal == SOCKET_ERROR)
        {
            printf("Unable to send\n");
            //system("pause");
 
            closesocket(clientSock);
            printf("Connection closed\n");
 
            return SOCKET_ERROR;
        }
    }
}
 
int main(void)
{
    WORD sockVer;
    WSADATA wsaData;
    int retVal;
 
    sockVer = MAKEWORD(2, 2);
    WSAStartup(sockVer, &wsaData);
    servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
 
    if (servSock == INVALID_SOCKET)
    {
        printf("Unable to create socket\n");
        WSACleanup();
        system("pause");
        return SOCKET_ERROR;
    }
 
    SOCKADDR_IN sin;
    char* localIP;
    hostent* localHost;
 
    localHost = gethostbyname("");
    localIP = inet_ntoa(*(struct in_addr *)*localHost->h_addr_list);
 
    sin.sin_family = PF_INET;
    sin.sin_port = htons(3114);
    sin.sin_addr.s_addr = inet_addr(localIP);
 
    retVal = bind(servSock, (LPSOCKADDR)&sin, sizeof(sin));
    if (retVal == SOCKET_ERROR)
    {
        printf("Unable to bind\n");
        return SOCKET_ERROR;
    }
 
    printf("Server started at %s, port %d\n", inet_ntoa(sin.sin_addr), htons(sin.sin_port));
 
    while (true)
    {
        retVal = listen(servSock, 10);
        if (retVal == SOCKET_ERROR)
        {
            printf("Unable to listen\n");
            WSACleanup();
            //system("pause");
            return SOCKET_ERROR;
        }
 
        SOCKET clientSock;
        SOCKADDR_IN from;
        int fromlen = sizeof(from);
 
        clientSock = accept(servSock, (struct sockaddr*)&from, &fromlen);
        if (clientSock == INVALID_SOCKET)
        {
            printf("Unable to accept\n");
            WSACleanup();
            //system("pause");
            return SOCKET_ERROR;
        }
        printf("New connection accepted from %s, port %d\n", inet_ntoa(from.sin_addr), htons(from.sin_port));
 
        usersList[usersCount] = clientSock;
        usersCount++;
 
        DWORD threadID;
 
        CreateThread(NULL,NULL,work,&clientSock,NULL,&threadID);
    }
    closesocket(servSock);
    WSACleanup();
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.10.2014, 21:02
Ответы с готовыми решениями:

Chat Borland C++ 06
Я уже приступил, кое что нашел в сети, может кто то разбирается ?! Расскажите как Едиту, присовоить какую либо функцию ?! и можно ли...

Broadcast UDP chat
Здравствуйте. Нужно реализовать чат на UDP с использованием широковещательных запросов (простейшее консольное приложение с двумя тредами,...

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

7
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
19.10.2014, 01:05
Quadra, в коде клиента у вас прямая зависимость между отсылкой на сервер, а затем чтение что нам шлет серве. А нужно постоянно пытаться читать из сокета сервера. Для этого понадобится два треда на стороне клиента - один тред для чтения пользовательского ввода (главный тред, тот что в main()), второй взаимодействие с сервером.

Насчет сервера. В принципе, здесь тоже можно обойтись двумя тредами: первый (тот что зовется из функции main()) акцептит входящие соединения, второй пробегается по сокетам клиентов пытается читать из них (нужно выставить таймауты чтения на минимумы) если есть что-то то рассылает полученное сообщение остальным клиентам. Доступ к usersList нужно синхронизировать, например, с помощью критической секции.
1
10 / 10 / 0
Регистрация: 29.04.2013
Сообщений: 145
19.10.2014, 12:53  [ТС]
schdub, да, в этом и проблема. Я пытался ее решить через треды. Я выделял кусок

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cout << ">";
gets(pBuf);
 
if (strcmp(pBuf, exit) == 0) break;
else
{
     //printf("Sending request from client\n");
 
      retVal = send(clientSock, pBuf, strlen(pBuf), 0);
 
      if (retVal == SOCKET_ERROR)
      {
           printf("Unable to send\n");
           WSACleanup();
           system("pause");
           return 1;
      }
}
в отдельную подпрограмму и после while в main() вставлял CreateThread(NULL,NULL,get_message,&clie ntSock,NULL,&threadID);

Но у меня ничего не выходило. Происходило постоянное считывание и больше ничего, даже, кажется не отправлялось на сервер, или отправлялось но не принималось, сейчас снова попробую разбить на треды, спасибо.
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
19.10.2014, 13:10
Цитата Сообщение от Quadra Посмотреть сообщение
Я выделял кусок
Проблема в том, что gets() блокирующая функция (выполнение треда прерывается пока не прочитаем пользовательский ввод) она и должна быть в первом треде. А во втором треде чтение и отсылка в серверный сокет.
1
10 / 10 / 0
Регистрация: 29.04.2013
Сообщений: 145
19.10.2014, 13:23  [ТС]
schdub, вот так вроде бы работает
Кликните здесь для просмотра всего текста
C++ (Qt)
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#pragma comment (lib,"Ws2_32.lib")
#include <WinSock2.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <string>
using namespace std;
 
DWORD WINAPI get_message(LPVOID clientSocket)
{
    int retVal;
    SOCKET clientSock;
 
    clientSock = *((SOCKET *)clientSocket);
 
    char szResponse[256];
 
    retVal = recv(clientSock, szResponse, 256, 0);
 
    if (retVal == SOCKET_ERROR)
    {
        printf("Unable to recv\n");
        WSACleanup();
        system("pause");
        return 1;
    }
 
    if (retVal > 0)
    {
        char *Resp;
        Resp = szResponse;
        printf("Server<%s\n", Resp);
    }
}
 
DWORD WINAPI send_message(LPVOID clientSocket)
{
    int retVal;
    char pBuf[256], exit[5];
    SOCKET clientSock;
 
    clientSock = *((SOCKET *)clientSocket);
 
    exit[0] = 'e';
    exit[1] = 'x';
    exit[2] = 'i';
    exit[3] = 't';
    exit[4] = '\0';
 
    //cout << ">";
    gets(pBuf);
 
    //if (strcmp(pBuf, exit) == 0) return 0;
    //else
    //{
        //printf("Sending request from client\n");
 
        retVal = send(clientSock, pBuf, strlen(pBuf), 0);
 
        if (retVal == SOCKET_ERROR)
        {
            printf("Unable to send\n");
            WSACleanup();
            system("pause");
            return 1;
        }
    //}
}
 
int main()
{
    WORD ver = MAKEWORD(2, 2);
    WSADATA wsaData;
    int retVal = 0;
 
    WSAStartup(ver, (LPWSADATA)&wsaData);
 
    LPHOSTENT hostEnt;
 
    hostEnt = gethostbyname("localhost");
 
    if (!hostEnt)
    {
        printf("Unable to collect gethostbyname\n");
        WSACleanup();
        system("pause");
        return 1;
    }
 
    SOCKET clientSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
 
    if (clientSock == SOCKET_ERROR)
    {
        printf("Unable to create socket\n");
        WSACleanup();
        system("pause");
        return 1;
    }
 
    string ip;
    cout << "ip>";
    cin >> ip;
    cin.ignore();
 
    SOCKADDR_IN serverInfo;
 
    serverInfo.sin_family = PF_INET;
    serverInfo.sin_addr.S_un.S_addr = inet_addr(ip.c_str());
    serverInfo.sin_port = htons(3114);
 
    retVal = connect(clientSock, (LPSOCKADDR)&serverInfo, sizeof(serverInfo));
 
    if (retVal == SOCKET_ERROR)
    {
        printf("Unable to connect\n");
        WSACleanup();
        system("pause");
        return 1;
    }
 
    printf("Connection made successfully\n");
    printf("Enter 'exit' to exit\n");
 
    while (true)
    {
        DWORD threadID;
 
        CreateThread(NULL, NULL, get_message, &clientSock, NULL, &threadID);
        CreateThread(NULL, NULL, send_message, &clientSock, NULL, &threadID);       
    }
    closesocket(clientSock);
    WSACleanup();
    return 0;
}
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
19.10.2014, 13:37
Цитата Сообщение от Quadra Посмотреть сообщение
вот так вроде бы работает
Quadra, если это работает, то только благодаря текущему положению звезд на небе, а если серьезно, то в строке 124 бесконечный цикл, который на каждой итерации создет два треда. Вот псевдокод кода клиента:
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
#include <winsock2.h>
 
struct CHAT_CLIENT_CONTEXT {
  char szMessage[256];
  CRITICAL_SECTION csMessage
  bool newMessage;
};
 
// тред взаимодействия с сервером
 
DWORD WINAPI thread_worker(LPVOID param) {
  CHAT_CLIENT_CONTEXT * pCtx = (CHAT_CLIENT_CONTEXT*) param;
  SOCKET sock = SOCKET_ERROR;
  char buff[256];
 
  // TODO: создаем сокет, коннектимся к серверу и т.д.
  //       устанавливаем мин таймаут на чтение
 
  for (;;) {
    // TODO: пытаемся читать из сокета и выводим если что-то получили
    //       проверяем ошибки
 
    if (TryEnterCriticalSection(&pCtx->csMessage) != TRUE) continue;
    if (pCtx->newMessage) {
      // TODO: отсылаем сообщение серверу
      pCtx->newMessage = false;
    }
    LeaveCriticalSection(&pCtx->csMessage);
  }
}
 
// тред пользовательского ввода
 
int main() {
  CHAT_CLIENT_CONTEXT ctx;
  char buff[256];
 
  // TODO: инициализирум WinSock
 
  InitializeCriticalSection(&ctx.csMessage);
 
  DWORD threadID;
  CreateThread(NULL, NULL, thread_worker, &ctx, NULL, &threadID);
 
  for (;;) {
    gets(buff); // WARN: возможен buffer overrun
    if (strcmp(buff, "exit") == 0) break;
 
    // копируем для отправки и взводим флаг
    EnterCriticalSection(&ctx.csMessage);
    ctx.newMessage = true;
    strcpy(ctx.szMessage, buff);
    LeaveCriticalSection(&ctx.csMessage);
  }
  DeleteCriticalSection(&ctx.csMessage);
}
0
10 / 10 / 0
Регистрация: 29.04.2013
Сообщений: 145
19.10.2014, 14:25  [ТС]
schdub, как-то так получается, но к серверу не коннектится.

C++ (Qt)
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#pragma comment (lib,"Ws2_32.lib")
#include <WinSock2.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <string>
using namespace std;
 
 
struct CHAT_CLIENT_CONTEXT 
{
    char szMessage[256];
    CRITICAL_SECTION csMessage;
    bool newMessage;
};
 
// тред взаимодействия с сервером
 
DWORD WINAPI thread_worker(LPVOID param) 
{
    CHAT_CLIENT_CONTEXT * pCtx = (CHAT_CLIENT_CONTEXT*)param;
    SOCKET sock = SOCKET_ERROR;
    char buff[256];
 
    // TODO: создаем сокет, коннектимся к серверу и т.д.
    //       устанавливаем мин таймаут на чтение
 
    int retVal = 0;
 
    LPHOSTENT hostEnt;
 
    hostEnt = gethostbyname("localhost");
 
    if (!hostEnt)
    {
        printf("Unable to collect gethostbyname\n");
        WSACleanup();
        system("pause");
        return 0;
    }
 
    SOCKET clientSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
 
    if (clientSock == SOCKET_ERROR)
    {
        printf("Unable to create socket\n");
        WSACleanup();
        system("pause");
        return 0;
    }
 
    string ip;
    cout << "ip>";
    cin >> ip;
    cin.ignore();
 
    SOCKADDR_IN serverInfo;
 
    serverInfo.sin_family = PF_INET;
    serverInfo.sin_addr.S_un.S_addr = inet_addr(ip.c_str());
    serverInfo.sin_port = htons(3114);
 
    retVal = connect(clientSock, (LPSOCKADDR)&serverInfo, sizeof(serverInfo));
 
    if (retVal == SOCKET_ERROR)
    {
        printf("Unable to connect\n");
        WSACleanup();
        system("pause");
        return 0;
    }
 
    printf("Connection made successfully\n");
    printf("Enter 'exit' to exit\n");
 
    for (;;) 
    {
        // TODO: пытаемся читать из сокета и выводим если что-то получили
        //       проверяем ошибки
 
        char szResponse[256];
 
        retVal = recv(clientSock, szResponse, 256, 0);
 
        if (retVal == SOCKET_ERROR)
        {
            printf("Unable to recv\n");
            WSACleanup();
            system("pause");
            return 0;
        }
 
        if (retVal > 0)
        {
            char *Resp;
            Resp = szResponse;
            printf("Server<%s\n", Resp);
        }
 
        if (TryEnterCriticalSection(&pCtx->csMessage) != TRUE) continue;
        if (pCtx->newMessage) 
        {
            // TODO: отсылаем сообщение серверу
            retVal = send(clientSock, pCtx->szMessage, strlen(pCtx->szMessage), 0);
 
            if (retVal == SOCKET_ERROR)
            {
                printf("Unable to send\n");
                WSACleanup();
                system("pause");
 
            }
            pCtx->newMessage = false;
        }
        LeaveCriticalSection(&pCtx->csMessage);
    }
}
 
// тред пользовательского ввода
 
int main() 
{
    CHAT_CLIENT_CONTEXT ctx;
    char buff[256];
 
    // TODO: инициализирум WinSock
 
    WORD ver = MAKEWORD(2, 2);
    WSADATA wsaData;
 
    WSAStartup(ver, (LPWSADATA)&wsaData);
 
    InitializeCriticalSection(&ctx.csMessage);
 
    DWORD threadID;
    CreateThread(NULL, NULL, thread_worker, &ctx, NULL, &threadID);
 
    for (;;)
    {
        gets(buff); // WARN: возможен buffer overrun
        if (strcmp(buff, "exit") == 0) break;
 
        // копируем для отправки и взводим флаг
        EnterCriticalSection(&ctx.csMessage);
        ctx.newMessage = true;
        strcpy(ctx.szMessage, buff);
        LeaveCriticalSection(&ctx.csMessage);
    }
    DeleteCriticalSection(&ctx.csMessage);
}
Добавлено через 16 минут
Цитата Сообщение от schdub Посмотреть сообщение
то в строке 124 бесконечный цикл, который на каждой итерации создет два треда
Создает, но ведь они обрываются. Первый, если не может получить, второй, если не может отправить. Return же должна их обрывать.
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
19.10.2014, 17:08
Цитата Сообщение от Quadra Посмотреть сообщение
как-то так получается, но к серверу не коннектится.
Глядите что WSAGetLastError() возвращает, но в данном случае до коннекта и не доходит, т.к. вы одновременно в двух тредах из консоли пытаетесь читать (строки 54 и 140).

Цитата Сообщение от Quadra Посмотреть сообщение
Создает, но ведь они обрываются. Первый, если не может получить, второй, если не может отправить. Return же должна их обрывать.
Вы поглядите под Process Explorer сколько этот цикл создаст тредов в вашей программе.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.10.2014, 17:08
Помогаю со студенческими работами здесь

Local chat, C++ server JAVA client
Хочу написать локальный чат чтобы серверная часть была на C++ а клиентская на JAVA. По какой то причине JAVA не может принимать сообщения...

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

Tcp ip клиент-сервер C++ сервер выводит мусор
server # include &lt;sys/types.h&gt; # include &lt;iostream&gt; # include &lt;winsock2.h&gt; # include &lt;stdlib.h&gt; # pragma comment (lib,...

Клиент/сервер: клиент посылает серверу слово; определить, является ли это слово палиндромом
Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Функционирование клиента и сервера реализовать следующим образом:...

chat
public ChatServer(int port) throws IOException { ss = new ServerSocket(port); // создаем сервер-сокет this.port =...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru