当前位置: 首页 > 知识库问答 >
问题:

如何分离输入流-简单的客户端套接字程序

糜雪峰
2023-03-14

客户:

public class Client {

    private Socket clientSocket;
    private PrintWriter out;
    private BufferedReader in;
    private OutputStream os;
    private BufferedInputStream bis;
    private FileInputStream fis;
    private FileOutputStream fos;
    private BufferedOutputStream bos;
    private int bytesRead;
    private int current;

    public Client(String host, int port) throws IOException {
        clientSocket = new Socket(host, port);
        out = new PrintWriter(clientSocket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    }

    public void stopConnection() throws IOException {
        in.close();
        out.close();
        clientSocket.close();
    }

    public void menu() throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        while (true) {
            System.out.println("********************");
            System.out.println("1. CONN: Connect to Server");
            System.out.println("2. UPLD: Upload file");
            System.out.println("********************");
            System.out.print("Enter Choice: ");
            String input = br.readLine();
            out.write(input);
            out.flush();
            if(input.equals("UPLD")){
                sendFile();
            }
        }
    }

    public void sendFile() throws IOException {
        System.out.println("Enter filename");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String fileName = br.readLine();
        File myFile = new File(fileName);
        if(!myFile.exists()){
            System.out.println("File doesn't exist!");
            return;
        }
        else{
            System.out.println("File has been found!");
        }
        DataOutputStream dos = new DataOutputStream(clientSocket.getOutputStream()); //get the output stream of the socket
        dos.writeInt((int) myFile.length()); //write in the length of the file
        InputStream in = new FileInputStream(myFile); //create an inputstream from the file
        OutputStream out = clientSocket.getOutputStream(); //get output stream
        byte[] buf = new byte[8192]; //create buffer
        int len = 0;
        while ((len = in.read(buf)) != -1) {
            out.write(buf, 0, len); //write buffer
        }
        in.close(); //clean up
        out.close();
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("Enter Host:");
        String h = br.readLine();
        System.out.print("Enter port:");
        String p = br.readLine();
        Client ftp = new Client(h,Integer.parseInt(p));
        ftp.menu();
    }
} 

服务器:

public class Server {
    private ServerSocket serverSocket;
    private Socket clientSocket;
    private PrintWriter out;
    private BufferedReader in;
    private OutputStream os;
    private BufferedInputStream bis;
    private FileInputStream fis;

    private String fileName = "SampleFile.txt";

    public void start(int port) throws IOException {
        serverSocket = new ServerSocket(port);
        while (true) {
            String input;
            clientSocket = serverSocket.accept();
            out = new PrintWriter(clientSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

            input = in.readLine();
            if (input.equals("UPLD")) {
                //System.out.println("activate uploadFile");
                //System.out.println(input);
                receiveFile();
            } else System.out.println("Why?");
        }
    }

    public void stop() throws IOException {
        in.close();
        out.close();
        clientSocket.close();
        serverSocket.close();
    }

    public void receiveFile() throws IOException {
        DataInputStream dis = new DataInputStream(clientSocket.getInputStream()); //get the socket's input stream
        int size = dis.readInt(); //get the size of the file.
        InputStream inp = clientSocket.getInputStream();
        OutputStream out = new FileOutputStream("copy.txt"); //stream to write out file
        int totalBytesRead = 0;
        byte[] buf = new byte[8192]; //buffer
        int len = 0;
        while ((len = inp.read(buf)) != -1) {
            out.write(buf, 0, len); //write buffer
        }
        out.close(); //clean up
        inp.close();
    }

    public static void main(String[] args) throws IOException {
        Server server = new Server();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Please enter the port you wish to bind to: ");
        String port = br.readLine();
        server.start(Integer.parseInt(port));
        System.out.println("Connected to client; awaiting operation request");
    }
} 

如何使通过br.readline()分配给String输入的客户机输入首先发送到服务器,以便服务器知道调用receiveFile()方法,然后在客户机中调用sendFile()。我完全不知道为什么它现在不工作-我在将输入写入PrintWriter后执行flush(),所以为什么服务器不能先接收它,然后再接收文件?目前,当我打印服务器的BufferedReader时,它的输入和文件内容位于同一行。

共有1个答案

濮阳靖
2023-03-14

它的下一行字符在客户端发出问题。添加UPLD\n

public void menu() throws IOException{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    while (true) {
        System.out.println("********************");
        System.out.println("1. CONN: Connect to Server");
        System.out.println("2. UPLD: Upload file");
        System.out.println("********************");
        System.out.print("Enter Choice: ");
        String input = br.readLine();
        out.write(input+"\n");
        out.flush();
        if(input.equals("UPLD")){
            sendFile();
        }
    }
}
 类似资料:
  • 问题内容: 我已经阅读了很多有关该主题的内容,telnet是一种协议,而不是简单的套接字连接,正在等待换行符,使用外部库等等。 最重要的是,我需要启动并运行一个快速且肮脏的Java telnet应用程序,它不一定可扩展且不一定漂亮,因此我试图避免使用库,系统函数调用等。我一直在尝试和测试,到目前为止,当尝试登录路由器(当然是通过telnet)时,我什么都没有。 这是到目前为止我一直在使用的代码的一

  • 问题内容: TCP具有元组对(IP地址/端口/类型)来告诉另一个客户端。UDP传递客户端IP和端口。unix域如何跟踪不同的客户端? 换句话说,服务器创建一个绑定到某个路径的套接字,例如/ tmp / socket。2个或更多客户端连接到/ tmp / socket。底层发生了什么,可跟踪来自client1和client2的数据?我想网络堆栈在域套接字中不起作用,所以内核在这里完成所有工作吗? 是

  • 问题内容: 我想使用asyncio协程而不是多线程来重新实现我的代码。 server.py client.py 我知道有一些适当的异步网络库可以做到这一点。但是我只想在这种情况下使用asyncio核心库,以便对其有更好的了解。 仅在处理客户端定义之前添加async关键字真是太好了……这里的一段代码似乎有效,但是我仍然对实现感到困惑。 asyncio_server.py 如何以最佳方式和使用异步aw

  • 我已经看到了很多与我试图做的事情有关的问题,但我还没有找到任何解决方案。 我尝试编写两个套接字程序(一个客户端和一个服务器),以便服务器能够向客户端发送任何类型的文件(按字节)。我不确定如何构建/协调以下内容: > (在服务器中)读取语句从文件中获取数据(我使用fread()) (在服务器中)将数据发送到客户端的write语句(我使用的是write()) (在客户端)读取语句从服务器接收数据(我使

  • 在下面的链接中,我试图使用-对(双向无线电) http://tim.dysinger.net/posts/2013-09-16-geting-starting-with-nanomsg.html

  • Netty TCP Server在端口处运行,接收格式的数据。它使用Marine API库将胡言乱语转换为需要从套接字输入流的有意义的信息。 如何获得正在使用的netty服务器端口的输入流?

  • 我使用一个具有双向通信的套接字设置了一个客户端-服务器模型。 应该是这样的:1。客户端-发送单词数组2。服务器-读取单词数组3。服务器-发送布尔值4。客户端-读取布尔值5。客户端-发送图像6。服务器读取图像 这个过程在一个循环中,与第一次迭代完美配合,但在第二次迭代中,我得到了以下错误: JAVA网SocketException:软件导致的连接中止:套接字写入错误 我认为发生的是,当服务器返回到读

  • 我是python套接字编程的初学者,正在尝试编写一个与联网家庭自动化设备(GlobalCache GC100)接口的库 我既需要通过TCP不断监听来自该硬件的传感器状态变化事件,也需要能够在用户发起的时间发送set_state命令(trip relays),而没有明显的延迟。 我有一个循环,它执行来拾取状态更改事件。这通常会超时()并继续到下一个循环迭代,直到设备推送状态更改数据。 我是想做套接字