从C套接字客户端向Java套接字服务器读取输入
我有两个socket客户端和两个socket服务器,每一个都是用C和Java编写的,它们都作为进程运行在本地机器上 除了C套接字和Java服务器之外,它们都可以成功地相互通信。它们连接成功,但当我在C客户机中键入输入时,enter键不会完成消息并将其发送到Java服务器,与与与C服务器通信时的方式相同 如有任何见解,将不胜感激 Java服务器:从C套接字客户端向Java套接字服务器读取输入,java,c,sockets,client,Java,C,Sockets,Client,我有两个socket客户端和两个socket服务器,每一个都是用C和Java编写的,它们都作为进程运行在本地机器上 除了C套接字和Java服务器之外,它们都可以成功地相互通信。它们连接成功,但当我在C客户机中键入输入时,enter键不会完成消息并将其发送到Java服务器,与与与C服务器通信时的方式相同 如有任何见解,将不胜感激 Java服务器: import java.net.*; import java.io.*; public class SimpleServer extends Thre
import java.net.*;
import java.io.*;
public class SimpleServer extends Thread
{
private ServerSocket serverSocket;
String clientmsg = "";
public SimpleServer(int port) throws IOException
{
serverSocket = new ServerSocket(port);
serverSocket.setSoTimeout(10000);
}
public void run()
{
while(true)
{
try
{
System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "...");
Socket server = serverSocket.accept();
System.out.println("Just connected to " + server.getRemoteSocketAddress());
DataInputStream in = new DataInputStream(server.getInputStream());
System.out.println(in.readUTF());
DataOutputStream out = new DataOutputStream(server.getOutputStream());
out.writeUTF("Thank you for connecting to "
+ server.getLocalSocketAddress() + "\nGoodbye!");
server.close();
}
catch(SocketTimeoutException s)
{
System.out.println("Socket timed out!");
break;
}
catch(IOException e)
{
e.printStackTrace();
break;
}
}
}
public static void main(String [] args)
{
int port = Integer.parseInt(args[0]);
try
{
Thread t = new SimpleServer(port);
t.start();
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
C客户:
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
#include <netdb.h>
void error(char *msg)
{
perror(msg);
exit(0);
}
int main(int argc, char *argv[])
{
int sockfd, portno;
struct sockaddr_in serv_addr;
struct hostent *server;
int n;
char buffer[256];
if (argc < 3)
{
error("ERROR, no port provided");
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
error("ERROR opening socket");
}
server = gethostbyname(argv[1]);
if (server == NULL)
{
error("ERROR, host not found\n");
}
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = atoi(argv[2]);
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(portno);
bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
if (connect(sockfd,(struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
error("ERROR connecting to server");
}
printf("Enter a message for the server: ");
bzero(buffer,256);
fgets(buffer,sizeof(buffer),stdin);
n = write(sockfd,buffer,strlen(buffer));
if (n < 0)
{/
error("ERROR writing to socket");
}
bzero(buffer,256);
n = read(sockfd,buffer,255);
if (n < 0)
{
error("ERROR reading from socket");
}
printf("%s\n", buffer);
return 0;
}
#包括
#包括
#包括
#包括
#包括
无效错误(字符*消息)
{
佩罗尔(味精);
出口(0);
}
int main(int argc,char*argv[])
{
int sockfd,端口号;
服务地址中的结构sockaddr\u;
结构主机*服务器;
int n;
字符缓冲区[256];
如果(argc<3)
{
错误(“错误,未提供端口”);
}
sockfd=套接字(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
错误(“打开套接字时出错”);
}
server=gethostbyname(argv[1]);
如果(服务器==NULL)
{
错误(“错误,找不到主机\n”);
}
bzero((char*)&serv_addr,sizeof(serv_addr));
portno=atoi(argv[2]);
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(端口号);
b复制((char*)服务器->h_地址,(char*)和服务地址sin_地址s_地址,服务器->h_长度);
if(connect(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))<0)
{
错误(“连接到服务器时出错”);
}
printf(“为服务器输入消息:”);
b0(缓冲器,256);
fgets(缓冲区、sizeof(缓冲区)、stdin);
n=写入(sockfd,buffer,strlen(buffer));
if(n<0)
{/
错误(“写入套接字时出错”);
}
b0(缓冲器,256);
n=读取(sockfd,缓冲区,255);
if(n<0)
{
错误(“从套接字读取错误”);
}
printf(“%s\n”,缓冲区);
返回0;
}
来自readUTF()
文档:
首先,读取两个字节,并使用它们以readUnsignedShort方法的方式构造一个无符号16位整数。此整数值称为UTF长度,并指定要读取的附加字节数
在C客户机中,不发送这两个字节。当然,对于
writeUTF()
要由readUTF()
读取的数据必须由writeUTF(),
或可以生成相同协议的东西发送,这也是正确的:l:参见Javadoc。由于您的发件人是C,这是不实际的,因此您应该使用不同的读取API,例如readLine(),
,并在发件人处进行适当调整。我建议使用BufferedReader
和PrintWriter
,如下所示:
BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream())); // Bufferreader from socket
PrintWriter out = new PrintWriter(socket.getOutputStream(), true); // printwriter from socket
你可以简单地把它们当作
in.readLine(); // read a line
out.println(); // write a line
所以更新后的代码看起来像
Socket server = serverSocket.accept();
System.out.println("Just connected to " + server.getRemoteSocketAddress());
BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream()));
System.out.println(in.readline());
PrintWriter out = new PrintWriter(server.getOutputStream());
out.println("Thank you for connecting to ");
此外,如果我是正确的,这种方法将满足Java和C的线路终端条件。好的,谢谢。我应该如何解决此问题?在C客户机中发送2个字节,还是在Java程序中更改读取方法?ReadUTF似乎是读取文件的唯一方法string@Briscoooe最简单的方法是发送长度。无论如何,这是必需的,无论你做什么,你必须知道字符串何时结束
strlen
足以知道长度,但请注意,您必须发送的2个字节是big-endian。您能否就如何实现这一点给我一些指导?你有相关教程的链接吗?我试过了,但仍然遇到同样的问题。有没有关于如何修复它的建议?