插座交际,Java客户端C服务器 [英] Socket comunication, Java client C server

查看:109
本文介绍了插座交际,Java客户端C服务器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想通过socket Java客户端和C服务器进行通信
一切似乎如果我使用命令行数控连接,或者如果我用NC作为服务器和我的Java客户端连接,但是当我尝试连接Java客户端和C服务器不工作尝试服务器正常工作。

的客户端启动的连接,并发送该消息,消息由服务器接收的但随后server's响应从未到达客户机。

我将非常高兴,如果任何你能找到什么是错我的code。

服务器code:

 的#include<&stdio.h中GT;
#包括LT&; SYS / types.h中>
#包括LT&; SYS / socket.h中>
#包括LT&; netinet / in.h中>
#包括LT&;&strings.h GT;
#包括LT&;&unistd.h中GT;INT主(INT ARGC,CHAR *的argv [])
{
    INT的sockfd,clisockfd,PORTNO;
    字符*开始=你好;
    字符*结束=再见;
    socklen_t的clilen;
    字符缓冲区[256];
    焦炭contentBuffer [255];
    结构SOCKADDR_IN serv_addr,cli_addr;
    INT N;
    // INT optval的;    / *首先调用socket()函数* /
    的sockfd =插座(AF_INET,SOCK_STREAM,0);
    如果(的sockfd℃,)
    {
        PERROR(错误打开插座);
        返回(1);
    }    / *初始化套接字结构* /
    bzero((字符*)及serv_addr,sizeof的(serv_addr));
    PORTNO = 5000;
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(PORTNO);
    如果(绑定(的sockfd,(结构sockaddr *)及serv_addr,sizeof的(serv_addr))小于0)
    {
        PERROR(关于绑定错误);
        返回(1);
    }    听(的sockfd,5);
    clilen =(socklen_t的)的sizeof(cli_addr);    clisockfd =接受(的sockfd,(结构sockaddr *)及cli_addr,&安培; clilen);    如果(clisockfd℃,)
    {
        PERROR(ERROR在接受);
        返回(1);
    }    而(STRCMP(年底,contentBuffer)!= 0)
    {
        bzero(缓冲液,256);
        bzero(contentBuffer,255);
        / *如果建立连接,然后开始通信* /
        N =读(clisockfd,缓冲器,255);
        如果(正℃,)
        {
            PERROR(错误从套接字读取);
            返回(1);
        }        函数strncpy(contentBuffer,缓冲液,strlen的(缓冲器) - 1);
        如果(STRCMP(启动,contentBuffer)== 0)
        {
            的printf(命令:%S \\ n,缓冲区);
            N =写(clisockfd,罗杰说,,11);
            如果(正℃,)
            {
                PERROR(写入插座);
                返回(1);
            }
        }
        其他
        {
            的printf(未知命令:%S \\ n,缓冲区);
            N =写入(clisockfdERRCmd,7);
            如果(正℃,)
            {
                PERROR(写入插座);
                返回(1);
            }
        }
    }
    接近(的sockfd);
    返回0;
}

客户端code

 进口java.io. *;
进口java.net *。公共类Cliente {
    公共静态无效的主要(字串[] args)抛出IOException        如果(args.length!= 2){
            通信System.err.println(
                用法:JAVA EchoClient<主机名称><端口号>中);
            System.exit(1);
        }        字符串主机= ARGS [0];
        INT端口号=的Integer.parseInt(参数[1]);
        插座firstSocket =新的Socket(主机名,端口号);
        为PrintWriter了=的新PrintWriter(firstSocket.getOutputStream(),TRUE);
        在的BufferedReader =新的BufferedReader(新的InputStreamReader(firstSocket.getInputStream()));
        的BufferedReader标准输入=新的BufferedReader(新的InputStreamReader(System.in));
        串userInput;
        而((userInput = stdIn.readLine())!= NULL)
        {
            通过out.println(userInput);
            的System.out.println(收到:+ in.readLine());
        }
        附寄();
        stdIn.close();
        firstSocket.close();    }
}


解决方案

的readLine()块,直到连接已经关机()的close() D或收到新的行 \\ n ,它永远不会被发送由服务器

I am trying to communicate through sockets a Java client and a C server All seems to work fine if I try the server using nc on the command line to connect or if I use nc as a server and connect with my Java client, but when I try to connect Java Client and C server it doesn't work.

The client starts the connection, and sends the message, message is received by the server but then server´s response never arrives to client.

I will be very pleased if any of you can find what is wrong on my code.

Server Code:

#include <stdio.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>
#include <strings.h>
#include <unistd.h>

int main( int argc, char *argv[] )
{
    int sockfd, clisockfd, portno;
    char * start = "hello";
    char * end = "bye";
    socklen_t clilen;
    char buffer[256];
    char contentBuffer[255];
    struct sockaddr_in serv_addr, cli_addr;
    int  n;
    //int optval;

    /* First call to socket() function */
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) 
    {
        perror("ERROR opening socket");
        return(1);
    }

    /* Initialize socket structure */
    bzero((char *) &serv_addr, sizeof(serv_addr));
    portno = 5000;
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(portno);


    if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
    {
        perror("ERROR on binding");
        return(1);
    }

    listen(sockfd,5);
    clilen = (socklen_t) sizeof(cli_addr);

    clisockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);

    if (clisockfd < 0) 
    {
        perror("ERROR on accept");
        return(1);
    }

    while (strcmp(end, contentBuffer) !=0)
    {
        bzero(buffer,256);
        bzero(contentBuffer,255);
        /* If connection is established then start communicating */
        n = read( clisockfd,buffer,255 );
        if (n < 0)
        {
            perror("ERROR reading from socket");
            return(1);
        }

        strncpy(contentBuffer,buffer,strlen(buffer) - 1);  
        if (strcmp(start, contentBuffer) ==0)
        {
            printf("command: %s\n",buffer);
            n = write(clisockfd,"Roger that",11);
            if (n < 0)
            {
                perror("ERROR writing to socket");
                return(1);
            }
        }
        else 
        {
            printf("Unknown command: %s\n",buffer);
            n = write(clisockfd,"ERRCmd",7);
            if (n < 0)
            {
                perror("ERROR writing to socket");
                return(1);
            }           
        }
    }
    close(sockfd);
    return 0;


}

Client Code:

import java.io.*;
import java.net.*;

public class Cliente {
    public static void main(String[] args) throws IOException {

        if (args.length != 2) {
            System.err.println(
                "Usage: java EchoClient <host name> <port number>");
            System.exit(1);
        }

        String hostName = args[0];
        int portNumber = Integer.parseInt(args[1]);
        Socket firstSocket = new Socket(hostName, portNumber);
        PrintWriter out = new PrintWriter(firstSocket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(firstSocket.getInputStream()));
        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        String userInput;
        while ((userInput = stdIn.readLine()) != null) 
        {
            out.println(userInput);
            System.out.println("received: " + in.readLine());
        }
        in.close();
        stdIn.close();
        firstSocket.close();

    }
}

解决方案

readLine() blocks until the connection had been shutdown() or close()d or it received a new-line \n, which never is sent by the server.

这篇关于插座交际,Java客户端C服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆