Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
如何使用Java正确地从套接字流式传输数据_Java_Sockets_Csv_Tcp Ip - Fatal编程技术网

如何使用Java正确地从套接字流式传输数据

如何使用Java正确地从套接字流式传输数据,java,sockets,csv,tcp-ip,Java,Sockets,Csv,Tcp Ip,我试图用Java在套接字上传输数据,试图编写一个Kafka生成器。我已经编写了一个类来提取数据,但是没有得到预期的结果。我已经把它设置好了,这样数据就可以从Linux设备中传输出来。数据源是一个csv文件,我正在使用nc实用程序对其进行流式处理。该类正在Eclipse的Windows 10计算机上运行。当我上课时,我看到两件奇怪的事情 列标题不会被传输 我只能办一次班。如果我想再次运行它,我必须停止nc并重新启动它 下面是我的代码。我遗漏了什么吗?在这一点上,我只是试图连接到插座,并把数据拉过来

我试图用Java在套接字上传输数据,试图编写一个Kafka生成器。我已经编写了一个类来提取数据,但是没有得到预期的结果。我已经把它设置好了,这样数据就可以从Linux设备中传输出来。数据源是一个csv文件,我正在使用nc实用程序对其进行流式处理。该类正在Eclipse的Windows 10计算机上运行。当我上课时,我看到两件奇怪的事情

  • 列标题不会被传输
  • 我只能办一次班。如果我想再次运行它,我必须停止nc并重新启动它
  • 下面是我的代码。我遗漏了什么吗?在这一点上,我只是试图连接到插座,并把数据拉过来

    我使用以下命令运行nc: $nc-kl 9999 下面是我的班级

    import java.net.*;
    import java.io.*;
    
    public class Client 
    {
    static String userInput;
    
    public static void main(String [] args)
    {
    
        try
        {
            InetAddress serverAddress = InetAddress.getByName("servername");
            Socket socket = new Socket(serverAddress, 9999);
            BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    
            while ((userInput = input.readLine()) != null) {
                System.out.println(input.readLine());
            }
    
            input.close();
            socket.close();
    
        }
        catch(UnknownHostException e1)
        {
            System.out.println("Unknown host exception " + e1.toString());
        }
        catch(IOException e2)
        {
            System.out.println("IOException " + e2.toString());
        }
        catch(IllegalArgumentException e3)
        {
            System.out.println("Illegal Argument Exception " + e3.toString());
        }
        catch(Exception e4)
        {
            System.out.println("Other exceptions " + e4.toString());
        }
    }
    }
    

    首先,每个调用
    readLine()
    都试图从输入流中读取行。 在
    userInput=input.readLine()
    中,您读取标题,但
    println(input.readLine())
    在控制台中读取正文并打印

    while ((userInput = input.readLine()) != null) { 
         System.out.println(userInput); //instead input.readLine()
    }
    

    第二,我并没有使用nc,但我认为,若您在
    finally
    语句中关闭套接字(和读卡器),问题将得到解决。

    我希望这会有所帮助

    对于第一个问题:您试图打印
    userInput
    string。但它正在打印另一个
    readline()
    调用的结果

    第二个:文件传输后,必须停止并重新启动
    nc
    ;不管你从你身边做什么。它来自
    nc


    请参阅。

    您正在丢弃所有奇数行。应该是:

    while ((userInput = input.readLine()) != null) {
        System.out.println(userInput);
    }
    
    其次,您没有关闭套接字。使用以下资源进行尝试:

    try
    {
        InetAddress serverAddress = InetAddress.getByName("servername");
        try (
            Socket socket = new Socket(serverAddress, 9999);
            BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        ) {
            while ((userInput = input.readLine()) != null) {
                System.out.println(input.readLine());
            }
        }
    }
    catch (...)
    

    当我尝试添加finally块时,无法识别输入和套接字。请定义它们上面的
    try
    block。我没有遵循。好的,我已取回标题。当我尝试按照您的建议执行try块时,我应该如何处理:InetAddress serverAddress=InetAddress.getByName(“servername”);当我尝试将其放入时,我得到一个错误InetAddress未实现AutoCloseableOk nevermind。我将Socket()的主机名和端口号作为类变量。但是仍然无法正确关闭连接。请使用嵌套的
    try
    块。把上面的那个放在里面,围绕着插座读代码。看编辑。哦,酷。我甚至不知道你能做到。好的,关于关闭连接的事情。我还是觉得有点不对劲。我仍然无法在不重新启动nc的情况下多次运行它。就好像它知道它已经发送了一次,不需要再发送一次,尽管我现在希望这样做。@Kwang ChunKang表示,
    nc
    不会继续重新发送文件:您必须重新启动它。这不是Java代码中的缺陷,也不是“我的意见”。这是事实。这是一种文化表达方式,在亚洲文化中表现得很谦虚。无论如何,谢谢你给我的建议。嗯..此外,由于nc已经从其端发送了所有流,他必须停止nc并重新启动。您只需通过telnet conneciton进行尝试即可:(我不知道你编辑了文本,我接受了你的建议并重新编辑了答案。嗯……无论如何,谢谢你给我的建议。