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_Printwriter_Datainputstream_Inputstreamreader - Fatal编程技术网

Java 客户端套接字将不会从服务器接收数据

Java 客户端套接字将不会从服务器接收数据,java,sockets,printwriter,datainputstream,inputstreamreader,Java,Sockets,Printwriter,Datainputstream,Inputstreamreader,我的问题是,在我的客户机中,dis.read()返回-1,导致它从未实际收到文件。我能想到的唯一一件事是,因为我在本节之前使用了PrintWriter和BufferedReader,所以dis.read()认为所有数据都已经收到了 客户端代码: public static void receiveFile(String serverAddress, int port, String fileName, String fileOut) throws IOException { Socket

我的问题是,在我的客户机中,
dis.read()
返回
-1
,导致它从未实际收到文件。我能想到的唯一一件事是,因为我在本节之前使用了
PrintWriter
BufferedReader
,所以
dis.read()
认为所有数据都已经收到了

客户端代码:

public static void receiveFile(String serverAddress, int port, String fileName, String fileOut) throws IOException {
    Socket client = new Socket(serverAddress, port);
    client.setSoTimeout(5000);
    PrintWriter out = new PrintWriter(client.getOutputStream(), true);
    BufferedReader input = new BufferedReader(new InputStreamReader(client.getInputStream()));

    try {
        out.println("101|" + fileName + "\n");

        if (input.readLine().equals("201")) {
            int br;
            byte[] data = new byte[4096];

            DataInputStream dis = new DataInputStream(client.getInputStream());
            FileOutputStream fos = new FileOutputStream(fileOut);

            while ((br = dis.read(data, 0, data.length)) != -1){
                fos.write(data, 0, br);
            }

            fos.close();
            dis.close();
        }
    } catch (SocketTimeoutException ste) {
        ste.printStackTrace();
        client.close();
    }
}
private void sendFile(String filename, Socket client) throws IOException {
    int br;
    byte[] data = new byte[4096];
    PrintWriter out = new PrintWriter(client.getOutputStream(), true);

    out.println("201\n");

    DataOutputStream dos = new DataOutputStream(client.getOutputStream());
    FileInputStream fis = new FileInputStream(MeshFS.properties.getProperty("repository") + filename);

    while ((br = fis.read(data, 0, data.length)) != -1) {
        dos.write(data, 0, br);
        dos.flush();
    }

    fis.close();
    dos.close();
}

private String receiveRequest(Socket client) {
    String requestPart;
    String requestFull = "";
    try {
        BufferedReader input = new BufferedReader(new InputStreamReader(client.getInputStream()));

        while (((requestPart = input.readLine()) != null) && (requestFull.length() < 2048)) {
            if (requestPart.equals("")) break;
            requestFull = requestFull + requestPart;
        }

        return requestFull;
    } catch (IOException ioe) {
        return requestFull;
    }
}

private void processRequest(String request, Socket out) {

    if (request != null) {
        try {
            String[] requestParts = request.split("\\|");
            if (requestParts[0].equals("101")) {            //101:Get file
                sendFile(requestParts[1], out);

            } else {
                badRequest(out, request);
            }
        } catch (Exception e) {
            badRequest(out, request);
            e.printStackTrace();
        }
    }
}

    public void run() {
        while (!Thread.interrupted()) {
            try {
                server.setSoTimeout(1000);
                Socket client = server.accept();
                client.setSoTimeout(timeout);
                processRequest(receiveRequest(client), client);
                client.close();
            } catch (SocketTimeoutException ste) {
            } catch (IOException io) {
                io.printStackTrace();
            }
        }
        System.out.println("Socket closed");
}
服务器代码:

public static void receiveFile(String serverAddress, int port, String fileName, String fileOut) throws IOException {
    Socket client = new Socket(serverAddress, port);
    client.setSoTimeout(5000);
    PrintWriter out = new PrintWriter(client.getOutputStream(), true);
    BufferedReader input = new BufferedReader(new InputStreamReader(client.getInputStream()));

    try {
        out.println("101|" + fileName + "\n");

        if (input.readLine().equals("201")) {
            int br;
            byte[] data = new byte[4096];

            DataInputStream dis = new DataInputStream(client.getInputStream());
            FileOutputStream fos = new FileOutputStream(fileOut);

            while ((br = dis.read(data, 0, data.length)) != -1){
                fos.write(data, 0, br);
            }

            fos.close();
            dis.close();
        }
    } catch (SocketTimeoutException ste) {
        ste.printStackTrace();
        client.close();
    }
}
private void sendFile(String filename, Socket client) throws IOException {
    int br;
    byte[] data = new byte[4096];
    PrintWriter out = new PrintWriter(client.getOutputStream(), true);

    out.println("201\n");

    DataOutputStream dos = new DataOutputStream(client.getOutputStream());
    FileInputStream fis = new FileInputStream(MeshFS.properties.getProperty("repository") + filename);

    while ((br = fis.read(data, 0, data.length)) != -1) {
        dos.write(data, 0, br);
        dos.flush();
    }

    fis.close();
    dos.close();
}

private String receiveRequest(Socket client) {
    String requestPart;
    String requestFull = "";
    try {
        BufferedReader input = new BufferedReader(new InputStreamReader(client.getInputStream()));

        while (((requestPart = input.readLine()) != null) && (requestFull.length() < 2048)) {
            if (requestPart.equals("")) break;
            requestFull = requestFull + requestPart;
        }

        return requestFull;
    } catch (IOException ioe) {
        return requestFull;
    }
}

private void processRequest(String request, Socket out) {

    if (request != null) {
        try {
            String[] requestParts = request.split("\\|");
            if (requestParts[0].equals("101")) {            //101:Get file
                sendFile(requestParts[1], out);

            } else {
                badRequest(out, request);
            }
        } catch (Exception e) {
            badRequest(out, request);
            e.printStackTrace();
        }
    }
}

    public void run() {
        while (!Thread.interrupted()) {
            try {
                server.setSoTimeout(1000);
                Socket client = server.accept();
                client.setSoTimeout(timeout);
                processRequest(receiveRequest(client), client);
                client.close();
            } catch (SocketTimeoutException ste) {
            } catch (IOException io) {
                io.printStackTrace();
            }
        }
        System.out.println("Socket closed");
}
private void sendFile(字符串文件名,套接字客户端)引发IOException{
int-br;
字节[]数据=新字节[4096];
PrintWriter out=新的PrintWriter(client.getOutputStream(),true);
out.println(“201\n”);
DataOutputStream dos=新的DataOutputStream(client.getOutputStream());
FileInputStream fis=新的FileInputStream(MeshFS.properties.getProperty(“存储库”)+文件名);
while((br=fis.read(data,0,data.length))!=-1){
dos.write(数据,0,br);
dos.flush();
}
fis.close();
dos.close();
}
私有字符串receiveRequest(套接字客户端){
字符串请求部分;
字符串requestFull=“”;
试一试{
BufferedReader输入=新的BufferedReader(新的InputStreamReader(client.getInputStream());
而(((requestPart=input.readLine())!=null)和(&(requestFull.length()<2048)){
如果(requestPart.equals(“”)中断;
requestFull=requestFull+requestPart;
}
全额退货;
}捕获(ioe异常ioe){
全额退货;
}
}
私有void processRequest(字符串请求、套接字输出){
if(请求!=null){
试一试{
字符串[]requestParts=request.split(“\\\\”);
if(requestParts[0].equals(“101”){//101:Get文件
sendFile(requestParts[1],out);
}否则{
坏请求(out,request);
}
}捕获(例外e){
坏请求(out,request);
e、 printStackTrace();
}
}
}
公开募捐{
而(!Thread.interrupted()){
试一试{
服务器设置超时(1000);
Socket client=server.accept();
客户端设置超时(超时);
processRequest(接收方请求(客户),客户);
client.close();
}捕捉(SocketTimeoutException ste){
}捕获(io异常){
io.printStackTrace();
}
}
System.out.println(“插座关闭”);
}

有没有什么东西我遗漏了或忘了包括在内?我不是在冲洗什么东西还是在清理什么东西?

好吧,我想我发现了错误。我做了一些实验,发现如果多个对象试图读取,
InputStream
的行为会很奇怪。在您的情况下,很可能是客户端的
receiveFile
方法中的
BufferedReader
DataInputStream
通过尝试读取相同的
inputStream
导致了问题。我建议使用
DataInputStream
也读取第一行,这样就不必创建
BufferedReader
。即使不推荐使用
DataInputStream.readLine()
方法,但在您的情况下,它应该仍然很好

我编辑了clients
receiveFile
方法,使用
DataInputStream
读取第一行。希望它能起作用

public static void receiveFile(String serverAddress, int port, String fileName, String fileOut) throws IOException {
    Socket client = new Socket(serverAddress, port);
    client.setSoTimeout(5000);
    PrintWriter out = new PrintWriter(client.getOutputStream(), true);
    DataInputStream dis = new DataInputStream(client.getInputStream());

    try {
        out.println("101|" + fileName + "\n");

        if (dis.readLine().equals("201")) {
            int br;
            byte[] data = new byte[4096];

            FileOutputStream fos = new FileOutputStream(fileOut);

            while ((br = dis.read(data, 0, data.length)) != -1){
                fos.write(data, 0, br);
            }

            fos.close();
            dis.close();
        }
    } catch (SocketTimeoutException ste) {
        ste.printStackTrace();
        client.close();
    }
}

你能提供更多的代码吗?我想看看你接受与serversocketI的连接的部分。我更新了我的代码,几乎包含了所有内容,请看一看。