簡體   English   中英

Java套接字編程和流

[英]Java Socket Programming and Streams

我編寫了以下代碼,用於使用套接字將文本文件從客戶端發送到服務器。 我是JAVA和Socket編程的新手。 我覺得我已經有了套接字的概念,但是Java Streams令人困惑。 以下代碼的任何幫助將非常有幫助。 請在推理中提及錯誤和解決方案。

數據似乎發送正確。 但是另一端沒有收到。

服務器代碼:

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()輸出編寫器。

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語句的用法,該語句可確保關閉流,而不管應用程序的結果如何。 這樣可以確保您的流將始終關閉,並且不會泄漏任何資源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM