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 */
Java客户端在哪里写'*'? – alk
thanku ..我追加了$ atlast后附加了* ..但仍然不起作用 – user2267312
同样的问题改写:你真的想'readtring()'永久循环(看起来正在发生)如果客户端不'在请求中放置'*'? –