Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/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 - Fatal编程技术网

Java套接字编程和流

Java套接字编程和流,java,sockets,Java,Sockets,我编写了以下代码,用于使用套接字将文本文件从客户端发送到服务器。我对JAVA和Socket编程都是新手。我觉得我已经掌握了套接字的概念,但是Java流非常混乱。 以下代码的任何帮助都将非常有用。 请用推理说明错误和解决方法 数据似乎发送得很好。但另一端没有收到 服务器代码: import java.io.*; import java.net.*; public class Server { public static void main(String[] args) throws Ex

我编写了以下代码,用于使用套接字将文本文件从客户端发送到服务器。我对JAVA和Socket编程都是新手。我觉得我已经掌握了套接字的概念,但是Java流非常混乱。 以下代码的任何帮助都将非常有用。 请用推理说明错误和解决方法

数据似乎发送得很好。但另一端没有收到

服务器代码:

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

public class Server {
    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(3000);
        while(true)
        {
            Socket convSocket = serverSocket.accept();
            System.out.println("connection accepted");

            BufferedReader in = new BufferedReader(new InputStreamReader(convSocket.getInputStream()));
            FileWriter fileOut = new FileWriter("/Users/aakashmalhotra/a.txt");

            int c;
            while( (c = in.read()) != -1){
                fileOut.write(c);
            }
            System.out.println("Transfer Done");
        }


    }
}
客户端代码:

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

public class Client {
    public static void main(String[] argv) throws Exception {
        Socket clientSocket = new Socket("localhost", 3000); // create a socket

        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

        BufferedReader fileIn = new BufferedReader(new FileReader("/Users/aakashmalhotra/s.txt"));

        int c;
        while ((c = fileIn.read()) != -1) {
            out.write(c);
        }

    }
}

您需要.flush()或.close()客户端的输出写入程序。

您需要.flush()或.close()客户端的输出写入程序。

IO对象,尤其是流,始终需要关闭。这是因为操作系统针对这些类型的操作进行了优化,它决定了数据何时应该通过管道发送。关闭资源,确保发送剩余的数据。服务器端的示例:

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

public class Server {
    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(3000);
        while (true) {
            Socket convSocket = serverSocket.accept();
            System.out.println("connection accepted");

            try (BufferedReader in = new BufferedReader(new InputStreamReader(convSocket.getInputStream()))) {
                try (FileWriter fileOut = new FileWriter("/Users/aakashmalhotra/a.txt")) {
                    int c;
                    while ((c = in.read()) != -1) {
                        fileOut.write(c);
                    }
                    System.out.println("Transfer Done");
                }
            }
        }
    }
}

请务必注意try with resource语句的用法,它确保无论应用程序的结果如何,流都将被关闭。这保证了您的流将始终关闭,并且没有资源泄漏。

IO对象,尤其是流,始终需要关闭。这是因为操作系统针对这些类型的操作进行了优化,它决定了数据何时应该通过管道发送。关闭资源,确保发送剩余的数据。服务器端的示例:

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

public class Server {
    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(3000);
        while (true) {
            Socket convSocket = serverSocket.accept();
            System.out.println("connection accepted");

            try (BufferedReader in = new BufferedReader(new InputStreamReader(convSocket.getInputStream()))) {
                try (FileWriter fileOut = new FileWriter("/Users/aakashmalhotra/a.txt")) {
                    int c;
                    while ((c = in.read()) != -1) {
                        fileOut.write(c);
                    }
                    System.out.println("Transfer Done");
                }
            }
        }
    }
}

请务必注意try with resource语句的用法,它确保无论应用程序的结果如何,流都将被关闭。这保证了您的流始终处于关闭状态,并且不会泄漏任何资源。

首先,您似乎不会关闭您的读者或作者。。。。另一个
抛出异常
,虽然不是问题的原因,但不应该这样做。至少,捕获异常并打印stacktraces。如果您不使用读卡器,而是使用流,那么它将更高效、更通用。如果您只是复制字节,则无需经历将字节转换为字符的麻烦。您也不应一次读取一个字节注意:即使使用套接字,您也必须记住关闭任何需要在使用完后关闭的资源的基本方法。首先,您似乎没有关闭读卡器或写卡器。。。。另一个
抛出异常
,虽然不是问题的原因,但不应该这样做。至少,捕获异常并打印stacktraces。如果您不使用读卡器,而是使用流,那么它将更高效、更通用。如果您只是复制字节,则无需经历将字节转换为字符的麻烦。您也不应一次读取一个字节。注意:即使使用套接字,您也必须记住关闭任何需要在使用完资源后关闭的资源的基本方法。或者更好的做法是使用try with resources语句。@flkes:使用如果你使用线程和助手类来处理你的流,@hovercraftfullofels;在这种情况下,请稍后手动关闭它,以免过早终止流,或者最好使用try with resources语句。@flkes:如果使用线程和助手类来处理流,则会有危险。@hovercraftfullofels;在这种情况下,请稍后手动关闭它,以避免过早终止流