Java客户端和c服务器没有连接

时间:2014-01-15 15:26:22

标签: java c sockets

我的程序有一个java gui部分,它使用用户名和密码并将它们连成一个。然后通过套接字将其发送到服务器.C服务器读取字符串并检查存储在文件(User_File)中的用户。然后它返回用户的类型..即admin或user ..通过socket发送的字符串不会在那里读取。但是之前的消息告诉连接已创建在服务器中打印..请查看这个..

Java客户端

private void loginActionPerformed(java.awt.event.ActionEvent evt) throws ClassNotFoundException  {//GEN-FIRST:event_loginActionPerformed
// TODO add your handling code here:
String user=uname.getText();
String pwd=pass.getText();
if(user.equals("")||pwd.equals(""))
    JOptionPane.showMessageDialog(null,"Fields cannot be empty");
else
{

    user = user.concat("$");
      user = user.concat(pwd);
      user = user.concat("$");
      System.out.println("User: "+user);
   /*   
      /** Define a host server */
  try
  {
      String host = "localhost";
      /** Define a port */
      int port = 35685;

      StringBuffer instr = new StringBuffer();
      String TimeStamp;
      System.out.println("SocketClient initialized");



        /** Obtain an address object of the server */
        InetAddress address = InetAddress.getByName(host);


        Socket connection = new Socket(address, port);




        System.out.println("SocketClient is initialized");


            PrintWriter dout = new PrintWriter(connection.getOutputStream(), true);

             ObjectInputStream din = new ObjectInputStream(connection.getInputStream());

             dout.println(user);



             String str = din.readLine();


             System.out.println("Read >"+str+"<");


                    if(str.equals("User"))
                    {
                        JOptionPane.showMessageDialog(null,"Successull login");
                        DisplayQuestions us = new DisplayQuestions();
                        us.setVisible(true);
                        this.dispose();

                    }

      }catch(IOException ex){}
}
}//GEN-LAST:event_loginActionPerformed

c server:

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

#define MYPORT 35685
#define BUFFERSIZE 100

char * readstring(int);
int authenticate(char *);
int writestring(int, char *);
char * readfile(int);
void sig_handler(int);


int sd; /* Socket for data transfer */

int main(
    int argc,
    char * argv[])
{
    int connfd; /* Active socket */
    int ret;    /* return value of functions */
    int status = 0; /* status of user defined functions */
    char * login; /* Char array to store user name and password */
    char wr_buffer[BUFFERSIZE];   /* Write buffer */
    char buf[BUFFERSIZE];   

    struct sockaddr_in serveraddr,  /* server address */
               clientaddr;  /* Client address */
    socklen_t length;   /* Length of client address */

    sd = socket(AF_INET, SOCK_STREAM, 0);
    if (0 > sd)
    {
    printf("Socket Creation error\n");
    exit(EXIT_FAILURE);
    }

    /* Signal handler */
    signal(SIGINT, sig_handler);

    /* Populating server */

    memset(&serveraddr, 0, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(MYPORT);
    serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);

    /* Binding the socket */

    ret = bind(sd, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
    if (0 > ret)
    {
    printf("Binding Error\n");
        exit(EXIT_FAILURE);
    }

    /* Assigning number of clients */

    ret = listen(sd, 5);
    if (0 > ret)
    {
    printf("Listening failure\n");
    exit(EXIT_FAILURE);
    }

    for(;;)
    {
    printf("I am waiting for client...\n");
    length = sizeof(clientaddr);
        connfd = accept(sd ,(struct sockaddr *)&clientaddr, &length);

    if (0 > connfd)
        {
        if (errno == EINTR)
        {
        printf("Interrupted system call\n");
        }
        continue;
    }
        printf("Connfd created\n");
        memset(buf, '\0', BUFFERSIZE);
    printf("Connection from %s\n",inet_ntop(AF_INET, &clientaddr.sin_addr, buf, sizeof(buf)));

        memset(wr_buffer, '\0', BUFFERSIZE);

    /* Reading user name and pass word from the user */

    login = readstring(connfd);

    printf("\nRead: %s", login);

        /* Checking whether user is authenticated or not */

        status = authenticate(login);

    if (0 < status)
    {
        if (1 == status)            /* status 1 for user */
        {
        strcpy(wr_buffer, "User");
        }
        if (2 == status)            /* status 2 for Admin */
        {
        strcpy(wr_buffer, "Admin");
        }

        ret = writestring(connfd, wr_buffer);   /* writing the string to socket */
        if (0 > ret)
        {
        printf("Writing to socket failed\n");
        exit(EXIT_FAILURE);
        }
        else
        {
        printf("Successfully written\n");
        }
    }
    else
    {
        strcpy(wr_buffer, "NotUser");   /* Status 0 for non user */
        ret = writestring(connfd, wr_buffer);
        if (0 > ret)
        {
        printf("Writing to socket failed\n");
        exit(EXIT_FAILURE);
        }
        else
        {
        printf("Successfully written\n");
        }
            exit(EXIT_FAILURE);
    }
        ret = close(connfd);
    if (0 > ret)
    {
        printf("error in closing active socket\n");
        exit(EXIT_FAILURE);
    }
        printf("Finished serving one client\n");
    }
    exit(EXIT_SUCCESS);
}

char * readstring(int sd)
{
    int flag = 0;
    int pointer = 0;
    int bytesread = 0;
    char * buffer;

    buffer = (char*) calloc (sizeof(char), BUFFERSIZE);

    /* Reading string from socket */

    while (0 < (bytesread = read(sd, buffer + pointer, BUFFERSIZE)))
    {
    pointer += bytesread;
        flag = 1;
        if ('*' == buffer[pointer - 1])
    {
        break;
        }
    }
    buffer[pointer - 1] = '\0';     /* Removing * from the string received from client */
    if (0 == flag)          /* Flag 0 for error in reading and 1 for success */
    {
    printf("Error in reading\n");
        exit(EXIT_FAILURE);
    }
    return buffer;
}

int authenticate(char * buffer)
{
    int fd;
    int ret = 0;
    int status = 0;
    char * temp;
    char * user;
    char * passwd;
    char * file_buffer;

    fd = open("User_File",O_RDONLY);    /* User_File is file containing the username,passwd and status */
    if (0 > fd)
    {
        printf("Error in opening file\n");
        exit(EXIT_FAILURE);
    }
                    /* buffer is from client having username and passwd concatenated using $ */
    user = strtok(buffer,"$");
    passwd = strtok(NULL, "$");

    file_buffer = readfile(fd);     /* storing file contents in the file_buffer */

    temp = strtok(file_buffer, "$");

    while (NULL != temp)        /* Tokenising file_buffer using $ */
    {
        if (0 == strcmp(temp, user))    /* If token matches with user string */
        {
        temp = strtok(NULL, "$");
        if (0 == strcmp(temp, passwd))  /* Checking for passwd matching */
        {
        temp = strtok(NULL,"$");
        status = atoi(temp);        /* If passwd matches assigning status value to status */
            }
            break;
    }
        temp = strtok(NULL,"$");
    }

    ret = close(fd);
    if (0 > ret)
    {
    printf("Error in closing\n");
    exit(EXIT_FAILURE);
    }
    return status;      /* Return status value */
}

char * readfile(int fd)
{
    struct stat sb;
    int size;
    int ret;
    char * buffer;

    fstat(fd, &sb);
    size = sb.st_size;

    buffer = (char*) malloc (sizeof(char) * (size + 1));

    ret = read(fd, buffer, (size + 1));     /* storing contents of file into buffer */
    if (0 > ret)
    {
    printf("Reading error\n");
    exit(EXIT_FAILURE);
    }

    buffer[size] = '\0';
    return buffer;
}

int writestring(
        int sd, 
        char * buffer)
{
    int byteswritten = 0;
    int pointer = 0;
    int length;

    strcat(buffer, "*");    /* Append msg to be sent with '*' */
    length = strlen(buffer);

    while (pointer < length)
    {
    byteswritten = write(sd,buffer + pointer, length - pointer);    /* writing to socket */
    if (0 > byteswritten)
    {
        printf("error in writing to socket\n");
        return 0;
    }
        pointer += byteswritten;
    }
    return 1;
}

void sig_handler(int sig)
{
    int ret;
    if (SIGINT  == sig)
    {
    printf("Exiting server \nCtrl + C Pressed\n");
        ret = close(sd);
        if (0 > ret)
    {
        printf("Error in closing \n");
        exit(EXIT_FAILURE);
    }
    }
}

User_File:

user1$abc123$1$
user2$def123$1$ /* 1 for user */
user3$abg123$2$ /* 2 for admin */

1 个答案:

答案 0 :(得分:1)

将readline()中的'*'替换为'\ n'。