C ++ сервер Java-клиентский сокет [дубликат]

Строка ошибки «Ссылка на объект, не установленная на экземпляр объекта.» указывает, что вы не назначили экземпляр объекта объектной ссылке, и все же вы получаете доступ к свойствам / методам этого объекта.

например: скажем, у вас есть класс под названием myClass и он содержит одно свойство prop1.

public Class myClass
{
   public int prop1 {get;set;}
}

Теперь вы получаете доступ к этому prop1 в каком-то другом классе, как показано ниже:

public class Demo
{
     public void testMethod()
     {
        myClass ref = null;
        ref.prop1 = 1;  //This line throws error
     }
}

выше строки выдает ошибку, потому что ссылка класса myClass объявлена, но не создана, или экземпляр объекта не назначается referecne этого класса.

Чтобы исправить это, вам нужно создать экземпляр (присвоить объект ссылке на этот класс).

public class Demo
{
     public void testMethod()
     {
        myClass ref = null;
        ref = new myClass();
        ref.prop1 = 1;  
     }
}
1
задан Dalton Conley 11 August 2010 в 05:45
поделиться

2 ответа

Вы распечатываете мусор, потому что recv не завершает нуль вашего буфера.

Важным разделом в приведенном ниже коде является:

int num = recv(client,buffer,BUFSIZE,0);
if (num < 1) break;

send(client, ">> ", 3, 0);     // <<-- Nice to have.
send(client, buffer, num, 0);

buffer[num] = '\0';            // <<-- Really important bit!

if (buffer[num-1] == '\n')     // <<-- Nice to have.
    buffer[num-1] = '\0';      // <<-- Nice to have.

cout << buffer << endl;

, который будет надлежащим образом завершите свой буфер перед тем, как его распечатать, а также удалите завершающую новую строку, если она есть (и разрешите клиенту различать входные и эхо-строки).

Этот (полная программа) работает немного лучше:

using namespace std;
#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>

#define BUFSIZE 1000
#define PORT 1234

int main() {
    char buffer[BUFSIZE];

    // define our address structure, stores our port
    // and our ip address, and the socket type, etc..
    struct sockaddr_in addrinfo;
    addrinfo.sin_family = AF_INET;
    addrinfo.sin_port = htons(PORT);
    addrinfo.sin_addr.s_addr = INADDR_ANY;

    // create our socket.
    int sock;
    if ( (sock = socket(addrinfo.sin_family, SOCK_STREAM, 0))  < 0) {
        cout << "Error in creating the socket.";
        return -1;
    }

    // bind our socket to the actual adress we want
    if (bind(sock, (struct sockaddr*)&addrinfo, sizeof(addrinfo)) != 0) {
        cout << "Error in binding.";
        return -1;
    }

    // open the socket up for listening
    if (listen(sock, 5) != 0) {
        cout << "Error in opening listener.";
        return -1;
    }

    char *msg = "Success! You are connected.\r\n";

    // continuously accept new connections.. but no multithreading.. yet
    while(1) {
        cout << "Waiting for connections...." << endl;

        struct sockaddr_in client_addr;
        socklen_t sin_size = sizeof(client_addr);

        if(int client =
            accept(sock, (struct sockaddr*)&client_addr, &sin_size))
        {
            cout << "Recieved new connection from "
                << inet_ntoa(client_addr.sin_addr) << endl;
            send(client, msg, strlen(msg), 0);
            while(1) {
                int num = recv(client,buffer,BUFSIZE,0);
                if (num < 1) break;
                send(client, ">> ", 3, 0);
                send(client, buffer, num, 0);

                buffer[num] = '\0';
                if (buffer[num-1] == '\n')
                    buffer[num-1] = '\0';
                cout << buffer << endl;
                strcpy(buffer, "");
            }
        } else {
            cout << "Error in accepting new connection." << endl;
        }
    }
    close(sock);
    return 0;
}

На стороне клиента:

$ telnet 127.0.0.1 1234
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Success! You are connected.
hello
>> hello
my name is pax
>> my name is pax
and you?
>> and you?
<CTRL-D>
Connection closed by foreign host.

и на стороне сервера:

$ ./testprog
Waiting for connections....
Recived new connection from 127.0.0.1
hello
my name is pax
and you?
Waiting for connections....
15
ответ дан paxdiablo 26 August 2018 в 22:39
поделиться
  • 1
    ok, поэтому recv фактически возвращает размер байта, который он содержит? – Dalton Conley 11 August 2010 в 06:04
  • 2
    Да, или -1 при ошибке или 0, если другой конец закрывает соединение, оба из которых здесь рассматриваются одинаково. – paxdiablo 11 August 2010 в 06:10

Проблема заключается в том, что buffer не гарантированно содержит нулевой символ, заканчивающий строку. Добавьте строку buffer[BUFSIZE-1] = '\0' непосредственно перед вашим cout << buffer.

Еще лучше, фактически записывайте, сколько байтов было получено, и используйте эту информацию, чтобы определить, перегрузили ли вы свой буфер.

1
ответ дан Borealid 26 August 2018 в 22:39
поделиться
  • 1
    хм, я понимаю, что вы говорите о нулевом характере. Но, похоже, это не работает. Я все еще получаю странный материал для вывода. Я, конечно, не переполнил бы мой буфер var четырьмя буквами, не так ли? – Dalton Conley 11 August 2010 в 05:55
  • 2
    вам нужно использовать возвращаемое значение из recv для хранения нулевого байта, иначе recv из «привет», а затем другой из "x" даст вам "xello" (плюс любой мусор уже в буфере за пятый байт (до конца) в обоих случаях). – paxdiablo 11 August 2010 в 09:48
Другие вопросы по тегам:

Похожие вопросы: