C-сервер - соединение с клиентским сокетом Java. При чтении сообщения на клиенте я вижу пустые места перед фактическим сообщением - PullRequest
0 голосов
/ 18 октября 2019

У меня есть сервер на C и клиент на Java (TCP-соединение). После того, как я их соединяю, я отправляю первое сообщение от клиента, затем ответ от сервера, и в этот момент все в порядке (клиент записывает в консоли полученную строку), когда я отправляю другое сообщение на сервер, и сервер дает ответ, этоОтвет помещается в конце длинной строки с неизвестными первыми символами. Например, на стороне клиента я вижу:

Send a message: type and press Enter key
HELLO
Server: HI
HELLO AGAIN
Server:                                 
HELLO HELLO
Server:    

Вывод на стороне сервера в порядке (видны как сообщения клиента, так и сервера)

Вот мой сервер:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define PORT 10011

int main(){

    int socketfd, ret;
    struct sockaddr_in serverAddr;

    int newSocket;
    struct sockaddr_in newAddr;

    socklen_t addr_size;

    char buffer[1024];
    pid_t childpid;

    socketfd = socket(AF_INET,SOCK_STREAM,0);

    if(socketfd < 0){
        printf("\n error in socket creation");
        return -1;
    }
    printf("\n Server socket is created\n");

    memset(&serverAddr, '\0', sizeof(serverAddr));
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(PORT);
    serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

    ret = bind(socketfd, (struct sockaddr*)&serverAddr, sizeof(serverAddr));

    if(ret < 0){
        printf("Error in binding\n");
        return -1;
    }
    printf("[*]Bind to port %d\n", PORT);

    if(listen(socketfd, 10) == 0){
        printf("Listening...\n");
    }else{
        printf("Error in binding\n");
    }

    newSocket = accept(socketfd, (struct sockaddr*)&newAddr, &addr_size);
    if( newSocket < 0){
        printf("No socket\n");
        exit(1);
    }
    int size = 1024;
    char buff[size];
    char sbuff[size];
    int n;
    int reader;
    memset(buff, 0, size);
    memset(sbuff, 0, size);
    // infinite loop for receiving and sending
    for (;;) {
        // read the message from client and copy it in buffer
        reader = recv(newSocket, buff, 1024 * sizeof(char), 0);
        if (reader == -1) {
            perror("recv()");
            break;
        } else if (reader == 0) {
            break;
        } else {
            // print buffer which contains the client contents
            printf("From client: %s\t To client : ", buff);
            // if msg contains "Exit" then server exit and chat ended.
            if (strncmp("exit", buff, 4) == 0) {
                printf("Server Exit...\n");
                break;
            }
            bzero(buff, size);

            n = 0;
            // copy server message in the buffer
            while ((sbuff[n++] = getchar()) != '\n');

// and send that buffer to client
            write(newSocket, sbuff, sizeof(sbuff));
            bzero(sbuff,size);



        }

    }
    close(newSocket);

    return 0;
}

и вот мой клиент:

import java.io.*;
import java.net.*;
public class ClientJava
{
    public static void main(String[] args) throws Exception
    {
        Socket sock = new Socket("127.0.0.1", 10011);
        // reading from keyboard (keyRead object)
        BufferedReader keyRead = new BufferedReader(new InputStreamReader(System.in));
        // sending to client (pwrite object)
        OutputStream ostream = sock.getOutputStream();
        PrintWriter pwrite = new PrintWriter(ostream, true);

        // receiving from server ( receiveRead  object)
        InputStream istream = sock.getInputStream();
        BufferedReader receiveRead = new BufferedReader(new InputStreamReader(istream), 1024);

        System.out.println("Send a message: type and press Enter key");

        String receiveMessage, sendMessage;
        while(true)
        {
            sendMessage = keyRead.readLine();  // keyboard reading
            pwrite.println(sendMessage);       // sending to server
            pwrite.flush();                    // flush the data

//            for(int i=0; i<1024;i++){
//                String s=receiveRead.read();
//                receiveMessage[i]=s;
//                if(s == ">") {
//                    return i;
//                }
//            }
//            System.out.println(receiveMessage);


            receiveMessage = receiveRead;
            if((receiveMessage) != "0") //receive from server
            {
                System.out.println(receiveMessage); // displaying at DOS prompt
            }
            //removeNonAscii(receiveMessage);
            //replaceUnreadable(receiveMessage);
            receiveMessage = receiveMessage.substring(0,0);


        }

    }
    private static String removeNonAscii(String s){
        StringBuffer sb = new StringBuffer();
        for(int i=0; i<s.length(); ++i){
            if(s.charAt(i) < 128){
                sb.append(s.charAt(i));
            }
        }
        return sb.toString();
    }
    private static String replaceUnreadable(String s){
        String clean = s.replaceAll("\\P{Print}", "");
        return clean;
    }
}    

После отладки я обнаружил, что при получении сообщения во второй раз recieveMessage полон пустых символов и фактическое сообщение доходит до концастроки (так что это не видно в консоли). Как я могу очистить строку или поместить сообщение в ее начало? Благодарю.

1 Ответ

0 голосов
/ 25 октября 2019

Решено: я использовал этот метод

private static String replaceUnreadable(String s){
        String clean = s.replaceAll("\\P{Print}", "");
        return clean;
    }

и он работал

...