Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C套接字客户端向Java套接字服务器读取输入_Java_C_Sockets_Client - Fatal编程技术网

从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

我有两个socket客户端和两个socket服务器,每一个都是用C和Java编写的,它们都作为进程运行在本地机器上

除了C套接字和Java服务器之外,它们都可以成功地相互通信。它们连接成功,但当我在C客户机中键入输入时,enter键不会完成消息并将其发送到Java服务器,与与与C服务器通信时的方式相同

如有任何见解,将不胜感激

Java服务器:

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。您能否就如何实现这一点给我一些指导?你有相关教程的链接吗?我试过了,但仍然遇到同样的问题。有没有关于如何修复它的建议?