简体   繁体   English

服务器未从Java TCP / IP客户端接收数据

[英]server not receiving data from java tcp/ip client

I'm currently writing a java client to connect to a remote server and push plain text to it. 我目前正在编写一个Java客户端以连接到远程服务器并将纯文本推入该客户端。 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. 我不知道服务器使用哪种语言,我被告知只是连接到某个端口上的IP地址,然后推送数据。

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. 我是Java的TCP / IP和套接字的新手,并且想知道我是否正在做一些奇怪的事情。

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. 基本上,我的Java客户端在某个目录中查找所有.txt文件,从这些文件中获取文本,然后将其通过输出流推送。 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: 这是我的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();
}

}

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. 编辑:另外,仅提及一下,我编写了一个“服务器” java文件来进行本地测试,并设法连接到该文件并成功地从我的客户程序发送数据。

Jarrett, your code is sending *something; Jarrett,您的代码正在发送*某物; 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. 如果要完全确定要发送的内容,请安装Wireshark ,进行连接,然后在发送数据时进行嗅探。 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 (eg 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. 只是一个猜测而已。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM