欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關于socket發(fā)送數據需要注意的問題

 更新時間:2024年08月10日 09:07:59   作者:Soulic  
這篇文章主要介紹了關于socket發(fā)送數據需要注意的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

socket發(fā)送數據需要注意的問題

這兩天在寫socket通信的時候遇到一個問題,在服務器端使用BufferedWriter.write()和BufferedWriter.flush()向客戶端發(fā)送信息后,客戶端使用BufferedReader.readLine()怎么也讀不到數據。

后來發(fā)現是因為沒有在write之后創(chuàng)建新的行,所以客戶端的readLine()不能判斷行結束,一直在等待服務器發(fā)送行結束符,就出現客戶端接收不到數據的現象。

解決的方法

是在write()后newLine(),再flush()客戶端就可以了。

	ServerSocket server = null;
	try {
		server = new ServerSocket(AppProvider.PORT, 0);
		BufferedReader in;
		BufferedWriter out;
		while (true) {
			Socket client = server.accept();
			
			in = new BufferedReader(new InputStreamReader(client.getInputStream()));
			out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
			out.flush();
			try {
				String request = in.readLine();
				String response = processMessage(request);
				if (response != null) {
					out.write(response);
					out.newLine();  
					out.flush();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
			
			in.close();
			out.close();
			client.close();
		}
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		if (server != null && !server.isClosed()) {
			try {
				server.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

Java-socket上傳 / 接收文件

Socket上傳文件

//測試示例
public void upSocket(){
    //Java中使用Socket進行文件上傳的基本流程如下所示:
    //創(chuàng)建客戶端Socket對象并連接到服務器??梢酝ㄟ^指定IP地址和端口號來完成連接操作。
    String serverIp = "服務器IP"; // 設置服務器IP地址
    int port = 8080; // 設置服務器監(jiān)聽的端口號

    Socket clientSocket = null;
    InputStream inputStream = null;
    OutputStream outputStream = null;
    try {
        clientSocket = new Socket(serverIp, port);
        //獲取輸入/輸出流對象,分別用于讀取要發(fā)送的文件內容和寫入從服務器返回的數據。
        String filePath = "要上傳的文件路徑";
        File fileToSend = new File(filePath);
        if (!fileToSend.exists()) {
            throw new IllegalArgumentException("指定的文件不存在!");
        }
        inputStream = new FileInputStream(filePath); // 設置要上傳的文件路徑
        outputStream = clientSocket.getOutputStream();
        //將文件內容逐段讀取后寫入輸出流,直到文件結尾。
        byte[] buffer = new byte[4096]; // 設置每次讀取的字節(jié)大小
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        outputStream.flush(); // 確保數據被全部寫入輸出流
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        //關閉輸入/輸出流和Socket連接。
        try {
            inputStream.close();
            outputStream.close();
            clientSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Socket接收文件

public static void main(String[] args) throws IOException {
    int portNumber = 8080;

    ServerSocket serverSocket = null;
    InputStream inputStream = null;
    FileOutputStream fileOutputStream = null;
    try {
        serverSocket = new ServerSocket(portNumber);
        System.out.println("正在監(jiān)聽端口" + portNumber + "...");

        Socket clientSocket = serverSocket.accept();
        System.out.println("客戶端已連接!");

        inputStream = clientSocket.getInputStream();
        fileOutputStream = new FileOutputStream("D:\\test\\received_file.txt");

        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            fileOutputStream.write(buffer, 0, bytesRead);
        }


    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        fileOutputStream.close();
        inputStream.close();
        serverSocket.close();
        serverSocket.close();
    }
}

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • JavaEE Cookie的基本使用細節(jié)

    JavaEE Cookie的基本使用細節(jié)

    本章我們將學習會話跟蹤技術中的Cookie與Session,它在我們整個JavaEE的知識體系中是非常重要的,本節(jié)我們先介紹Cookie,廢話不多說,直接上正文
    2022-12-12
  • SpringBoot編譯target目錄下沒有resource下的文件踩坑記錄

    SpringBoot編譯target目錄下沒有resource下的文件踩坑記錄

    這篇文章主要介紹了SpringBoot編譯target目錄下沒有resource下的文件踩坑記錄,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • idea類名顯示多行的設置方式

    idea類名顯示多行的設置方式

    在IntelliJ IDEA中,類名的顯示方式可以通過設置來調整,若想設置為單行顯示,需在設置中找到相關選項并勾選“√”,若需多行顯示,則取消勾選即可,此操作有助于優(yōu)化代碼視圖,提升開發(fā)效率
    2024-09-09
  • Java?split方法使用超詳細講解

    Java?split方法使用超詳細講解

    這篇文章主要給大家介紹了關于Java?split方法使用的相關資料,Java中的我們可以利用split把字符串按照指定的分割符進行分割,然后返回字符串數組,需要的朋友可以參考下
    2023-10-10
  • RHEL6.5下JDK1.8安裝教程

    RHEL6.5下JDK1.8安裝教程

    這篇文章主要為大家詳細介紹了RHEL6.5下JDK1.8安裝教程的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • java判斷今天,昨天,前天,不能用秒間隔的簡單實例

    java判斷今天,昨天,前天,不能用秒間隔的簡單實例

    下面小編就為大家?guī)硪黄猨ava判斷今天,昨天,前天,不能用秒間隔的簡單實例。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Java持久化XML文件配置解析

    Java持久化XML文件配置解析

    這篇文章主要為大家介紹了Java持久化XML文件配置解析,當你在使用?Java?編程語言?來編寫軟件時,實現持久化配置的方式。有需要的朋友可以借鑒參考下,希望能夠有所幫助<BR>
    2022-03-03
  • 一口氣說出Java 6種延時隊列的實現方法(面試官也得服)

    一口氣說出Java 6種延時隊列的實現方法(面試官也得服)

    這篇文章主要介紹了一口氣說出Java 6種延時隊列的實現方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • 詳解JAVA8 函數式接口

    詳解JAVA8 函數式接口

    這篇文章主要介紹了JAVA8 函數式接口的相關資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • 基于Redisson實現注解式分布式鎖的示例代碼

    基于Redisson實現注解式分布式鎖的示例代碼

    這篇文章主要為大家詳細介紹了如何基于Redisson實現注解式分布式鎖,文中的示例代碼講解詳細,具有一定的參考價值,需要的可以了解一下
    2023-07-07

最新評論