从c ++服务器向java客户端发送消息

时间:2014-01-28 14:30:24

标签: java c++ c sockets

我是c ++和socket编程的新手。我设法在unix机器中使用c ++创建服务器,并将该服务器连接到在不同的Windows机器上运行的java客户端。我还设法成功地从客户端向服务器发送消息。我还没有管理的是从服务器向客户端发送消息。我想这是我是c ++的新手,但我没有在互联网上找到非常有用的东西。我只发现c ++客户端到服务器通信代码而不是服务器到客户端。有人可以提供一些指导吗?

Thnx提前为你的时间和你的帮助......

C ++服务器代码

int main( int argc, const char** argv )
{


    /* SOCKET VARIABLES */
    int sock;
    struct sockaddr_in server;
    int mysock;
    char buff[1024];
    int rval;


    /*CREATE SOCKET*/
    sock =socket(AF_INET, SOCK_STREAM, 0);

    if (sock<0) 
    {
        perror("*FAILED TO CREATE SOCKET*");
        exit(1);
    }

    server.sin_family=AF_INET;
    server.sin_addr.s_addr=INADDR_ANY;
    server.sin_port=htons(5000);

    /*CALL BIND*/
    if (bind(sock, (struct sockaddr *)&server, sizeof(server)))
    {
        perror("BIND FAILED");
        exit(1);
    }


    /*LISTEN*/
    listen(sock, 5);


    /*ACCEPT*/
    do{

        mysock= accept(sock, (struct sockaddr *) 0, 0);

        if (mysock==-1) 
        {

            perror ("ACCEPT FAILED");
        }
        else
        {
            memset(buff, 0, sizeof(buff));

            if ((rval=recv(mysock, buff, sizeof(buff), 0)) < 0) 
                perror("READING STREAM MESSAGE ERROR");
            else if(rval==0)
                printf("Ending connection");
           else
                printf("MSG: %s\n", buff);

           printf("GOT THE MESSAGE (rval = %d)\n", rval);

            }

    }while (1) ;
    return 0; 

Java客户端代码

public class SOK_1_CLIENT {




    public void run() throws Exception
    {
        String adrress="172.16.151.237"; //localhost -- samemachine
        Socket SOCK =new Socket (adrress,5000);
        PrintStream PS =new PrintStream(SOCK.getOutputStream());
        PS.println("HELLO TO SERVER FROM CLIENT");

        InputStreamReader IR =new InputStreamReader(SOCK.getInputStream());
        BufferedReader BR = new BufferedReader(IR);

        String MESSAGE =BR.readLine();
        System.out.println(MESSAGE + "java");
    }


}

3 个答案:

答案 0 :(得分:1)

在C套接字中是双向通信文件描述符。您可以使用send(2)向他们写信。检查man 2 send

 char * buffer;
 size_t length, sent;

 while (length && (sent = send(mysock, buffer, length, 0)) > 0) {
      length -= send;
 }
 if (sent < 0) 
     perror("send");

请注意,与C BufferedWriter中的java send不同,不能保证一次性发送整个缓冲区。因此while循环。如果您想要缓冲套接字IO,那么您可以使用fdopen创建stdio流,但如果您希望能够传递标记并拦截套接字错误,则不建议这样做。

答案 1 :(得分:1)

好的,我发现你已经设法在C ++服务器上收到消息并从java客户端发送。请参阅java中的“从socket接收”和C ++中的“从socket发送”。在上面的代码中使用它们并记住服务器发送的时间,此时java客户端应该期待来自服务器的数据。这将解决您的问题。

如果您想使服务器客户端像聊天应用程序一样,您有两种可能:

  • 使用“选择”
    • 使用“threads”

根据您的要求和使用的语言强调关键字。

请参阅this了解C ++中的套接字和this中的java套接字

答案 2 :(得分:0)

使用send(),将最后一个参数(标志)设置为0。

如果你在Windows上,那么你可能还需要初始化和清理Winsock - 检查this