服务器未从 java tcp/ip 客户端接收数据

发布于 2025-01-05 10:32:23 字数 3952 浏览 0 评论 0原文

我目前正在编写一个java客户端来连接到远程服务器并向其推送纯文本。我不知道服务器使用什么语言,我被告知只需连接到某个端口上的 IP 地址,然后推送数据。

我连接得很好(显然),在我看来,数据发送得很好。然而,在服务器端,他们只看到我连接/断开连接,而没有收到任何数据。

我对 Java 中的 TCP/IP 和套接字很陌生,并且想知道我是否在做一些奇怪的事情。

基本上,我的 Java 客户端会查找某个目录中的所有 .txt 文件,从这些文件中获取文本,然后将该文本推送到输出流。一旦文件的数据被刷新,它就会将该文件移动到“已发送”目录,然后继续处理下一个文件(如果有)。

这是我的 Java 代码:

import java.net.*;
import java.io.*;

public class Client
{

public class MyFileFilter implements FilenameFilter {
    public boolean accept(File dir, String name) {
        return name.toLowerCase().endsWith(".txt");
    }
}

public Client()
{
    try {

        String dirName = "/var/lib/adt/";
        String sentDir = "/var/lib/adt/sent/";

        File directory = new File(dirName);
        if (!directory.exists()) {
            System.out.println("directory does not exist!  Location: " + dirName);
            return;
        }

        // get files in directory
        File[] listOfFiles = directory.listFiles(new MyFileFilter());

        if (listOfFiles == null || listOfFiles.length == 0) {
            System.out.println("No files to send.");
            return;
        }

        FileInputStream fin;
        DataInputStream dis;

        String sendAddr = "192.168.1.9";
        int sendPort = 9486;

        Socket client = new Socket(sendAddr, sendPort);
        //getting the o/p stream of that connection
        PrintStream out = new PrintStream(client.getOutputStream());
        //reading the response using input stream
        BufferedReader in= new BufferedReader(new InputStreamReader(client.getInputStream()));

        System.out.println("Sending file(s) to '" + sendAddr + ":" + sendPort + "'");

        for (int i = 0; i < listOfFiles.length; i++)  {
            if (listOfFiles[i].isFile())  {
                String fName = listOfFiles[i].getName();
                if (fName.endsWith(".txt") || fName.endsWith(".TXT")) {
                    fin = new FileInputStream (dirName + fName);
                    dis = new DataInputStream(fin);

                    String message = "";
                    String messagePart = "";
                    while ((messagePart = dis.readLine()) != null)
                        message += messagePart + "\n";

                    if (message.equals(""))
                        continue;

                    System.out.println("Sending file '" + fName + "' with message: " + message);

                    out.print(message);
                    System.out.println("Written!");
                    out.flush();
                    System.out.println("Flushed!");

                    // move file to 'sent' directory
                    File dir = new File(sentDir);

                    boolean success = listOfFiles[i].renameTo(new File(dir, fName));
                    if (!success) {
                        // File was not successfully moved
                        System.out.println("File not successfully moved to 'sent' directory.");
                    }

                    dis.close();
                    fin.close();
                }
            }
        }

        in.close();
        out.close();

        client.shutdownOutput();
        if (!client.isClosed())
            client.close();

        System.out.println("Successfully sent all file(s)!");
    } catch (Exception e) {
        System.out.println("ERROR while sending file: " + e.toString());
        e.printStackTrace();
    }

}

public static void main(String a[])
{
    new Client();
}

}

对于我的控制台输出,我得到以下结果:

jarrett@jarrett-Latitude-D520:~/Downloads$ java Client 
Sending file(s) to '192.168.1.9:9486'
Sending file 'blah.txt' with message: asdpoifjawpeoifjawpeoifjwapoeifjapwoie

Written!
Flushed!
Successfully sent all file(s)!

据我所知,我这边一切都很好。有谁知道为什么会发生这种情况?我明显做错了什么吗?

我很感激任何反馈!

干杯

贾勒特

编辑: 另外,只是提一下,我编写了一个“服务器”java 文件在本地进行测试,并成功连接到它并从我的客户端程序发送数据。

I'm currently writing a java client to connect to a remote server and push plain text to it. I have no idea what language the server is in, I'm told to just connect to an IP address on a certain port and then push data.

I am connecting just fine (apparently), and on my end it seems like the data is being sent fine. However, on the server end, they are only seeing me connect/disconnect, without any data being received.

I'm new to TCP/IP and sockets in Java, and am wondering if perhaps I'm doing something wonky on my end.

Basically, my Java Client finds all .txt files in a certain directory, takes the text from those files, and then pushes that text through the output stream. Once a file's data was flushed, it moves the file to a 'sent' directory, and then continues to the next file (if any).

Here's my Java code:

import java.net.*;
import java.io.*;

public class Client
{

public class MyFileFilter implements FilenameFilter {
    public boolean accept(File dir, String name) {
        return name.toLowerCase().endsWith(".txt");
    }
}

public Client()
{
    try {

        String dirName = "/var/lib/adt/";
        String sentDir = "/var/lib/adt/sent/";

        File directory = new File(dirName);
        if (!directory.exists()) {
            System.out.println("directory does not exist!  Location: " + dirName);
            return;
        }

        // get files in directory
        File[] listOfFiles = directory.listFiles(new MyFileFilter());

        if (listOfFiles == null || listOfFiles.length == 0) {
            System.out.println("No files to send.");
            return;
        }

        FileInputStream fin;
        DataInputStream dis;

        String sendAddr = "192.168.1.9";
        int sendPort = 9486;

        Socket client = new Socket(sendAddr, sendPort);
        //getting the o/p stream of that connection
        PrintStream out = new PrintStream(client.getOutputStream());
        //reading the response using input stream
        BufferedReader in= new BufferedReader(new InputStreamReader(client.getInputStream()));

        System.out.println("Sending file(s) to '" + sendAddr + ":" + sendPort + "'");

        for (int i = 0; i < listOfFiles.length; i++)  {
            if (listOfFiles[i].isFile())  {
                String fName = listOfFiles[i].getName();
                if (fName.endsWith(".txt") || fName.endsWith(".TXT")) {
                    fin = new FileInputStream (dirName + fName);
                    dis = new DataInputStream(fin);

                    String message = "";
                    String messagePart = "";
                    while ((messagePart = dis.readLine()) != null)
                        message += messagePart + "\n";

                    if (message.equals(""))
                        continue;

                    System.out.println("Sending file '" + fName + "' with message: " + message);

                    out.print(message);
                    System.out.println("Written!");
                    out.flush();
                    System.out.println("Flushed!");

                    // move file to 'sent' directory
                    File dir = new File(sentDir);

                    boolean success = listOfFiles[i].renameTo(new File(dir, fName));
                    if (!success) {
                        // File was not successfully moved
                        System.out.println("File not successfully moved to 'sent' directory.");
                    }

                    dis.close();
                    fin.close();
                }
            }
        }

        in.close();
        out.close();

        client.shutdownOutput();
        if (!client.isClosed())
            client.close();

        System.out.println("Successfully sent all file(s)!");
    } catch (Exception e) {
        System.out.println("ERROR while sending file: " + e.toString());
        e.printStackTrace();
    }

}

public static void main(String a[])
{
    new Client();
}

}

For my console output I get this:

jarrett@jarrett-Latitude-D520:~/Downloads$ java Client 
Sending file(s) to '192.168.1.9:9486'
Sending file 'blah.txt' with message: asdpoifjawpeoifjawpeoifjwapoeifjapwoie

Written!
Flushed!
Successfully sent all file(s)!

So as far as I can tell, everything is fine on my end. Does anyone know why this might be happening? Is there something I'm obviously doing wrong on my end??

I appreciate any feedback!

Cheers

Jarrett

EDIT: Also, just to mention, I wrote a 'Server' java file to test locally, and managed to connect to it and send it data from my Client program successfully.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

冧九 2025-01-12 10:32:23

Jarrett,你的代码正在发送*一些东西;它看起来不错,并且您正确地刷新了流,以避免它备份缓冲区并在关闭它时丢失。

如果您想绝对确定您正在发送某些内容,请安装 Wireshark,建立连接,然后在发送时嗅探它您的数据。您应该看到您正在发送的出站流量。

如果您看到它,则可以让客户端知道他们的服务未正确接收数据。我的猜测是,使用其端点的要求比他们向您传达的要多(例如标头、编码、格式等),并且在它们的末端可能存在解析错误,导致处理终止您的数据,因此他们只是假设您从未发送任何内容,因为他们没有看到存储在数据库或等效内容中的处理结果。

不过只是猜测。

Jarrett, your code is sending *something; it looks good and you are correctly flushing the stream so as to avoid it backing up the buffer and getting lost when you close it.

If you want to make absolutely sure you are sending something, install Wireshark, make the connection then sniff it as you send your data. You should see the outbound traffic you are sending.

If you see it, then you can let the client know that their service isn't receiving the data correctly. My guess is that there are more requirements for using their endpoint than they have communicated to you yet (e.g. headers, encoding, format, etc.) and on their end there is likely a parse error killing the processing of your data, so they just assume you never send anything because they aren't seeing a processed result stored in a DB or something equivalent.

Just a guess though.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文