關于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(); } }
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringBoot編譯target目錄下沒有resource下的文件踩坑記錄
這篇文章主要介紹了SpringBoot編譯target目錄下沒有resource下的文件踩坑記錄,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08