【问题标题】:Reading input from C socket client to Java socket server从 C 套接字客户端读取输入到 Java 套接字服务器
【发布时间】:2015-03-03 10:22:21
【问题描述】:

我有 2 个套接字客户端和 2 个套接字服务器,每个都使用 C 和 Java 语言,并且都作为进程在我的本地计算机上运行。

除了 C 套接字和 Java 服务器之外,它们都可以成功地相互通信。它们连接成功,但是当我在 C 客户端中输入输入时,回车键没有完成消息并将其发送到 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;
}

【问题讨论】:

    标签: java c sockets client


    【解决方案1】:

    我建议如下使用BufferedReaderPrintWriter

    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 的行终端条件。

    【讨论】:

    • 我试过了,但我仍然遇到同样的问题。关于如何修复它的任何建议?
    【解决方案2】:

    来自readUTF() 文档:

    首先,读取两个字节并使用 readUnsignedShort 方法的方式构造一个无符号的 16 位整数。这个整数值称为 UTF 长度,指定要读取的附加字节数。

    在您的 C 客户端中,您没有发送这两个字节。当然writeUTF()也是如此。

    【讨论】:

    • 好的,谢谢。我应该怎么做才能解决这个问题?在 C 客户端发送 2 个字节或更改 Java 程序中的读取方法? ReadUTF 似乎是读取字符串的唯一方法
    • @Briscoooe 最简单的方法是发送长度。无论如何都是必需的,无论您做什么,您都必须知道字符串何时结束。 strlen 知道长度就足够了,但请注意,您必须发送的 2 个字节是大端。
    • 您能否就如何实现这一点给我一些指导?你有相关教程的链接吗?
    【解决方案3】:

    readUTF() 读取的数据必须由writeUTF(), 或可以产生相同protoco:l 的东西发送:请参阅Javadoc。由于您的发件人是 C,这不实用,因此您应该使用不同的读取 API,例如 readLine(),,并在发件人处进行适当调整。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-24
      • 2017-10-05
      • 2014-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 2014-03-12
      相关资源
      最近更新 更多