插座交际,Java客户端C服务器 [英] Socket comunication, Java client C server
问题描述
我想通过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屋!