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