2014-01-15 68 views
0

我的程序有一个java gui部分,它接受用户名和密码并将它们连接成一个。然后它通过套接字发送到服务器。C服务器读取字符串并与存储在文件(User_File)中的用户进行核对。然后它返回用户类型..即是管理员还是用户..通过套接字发送的字符串不会在那里读取。但是之前的消息告诉连接已创建将被打印在服务器中。请查看这个..Java客户端和c服务器没有连接

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服务器:

#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

Java客户端在哪里写'*'? – alk

+0

thanku ..我追加了$ atlast后附加了* ..但仍然不起作用 – user2267312

+0

同样的问题改写:你真的想'readtring()'永久循环(看起来正在发生)如果客户端不'在请求中放置'*'? –

回答

1

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

相关问题