關(guān)于socket發(fā)送數(shù)據(jù)需要注意的問題
socket發(fā)送數(shù)據(jù)需要注意的問題
這兩天在寫socket通信的時候遇到一個問題,在服務器端使用BufferedWriter.write()和BufferedWriter.flush()向客戶端發(fā)送信息后,客戶端使用BufferedReader.readLine()怎么也讀不到數(shù)據(jù)。
后來發(fā)現(xiàn)是因為沒有在write之后創(chuàng)建新的行,所以客戶端的readLine()不能判斷行結(jié)束,一直在等待服務器發(fā)送行結(jié)束符,就出現(xiàn)客戶端接收不到數(shù)據(jù)的現(xiàn)象。
解決的方法
是在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ā)送的文件內(nèi)容和寫入從服務器返回的數(shù)據(jù)。
String filePath = "要上傳的文件路徑";
File fileToSend = new File(filePath);
if (!fileToSend.exists()) {
throw new IllegalArgumentException("指定的文件不存在!");
}
inputStream = new FileInputStream(filePath); // 設置要上傳的文件路徑
outputStream = clientSocket.getOutputStream();
//將文件內(nèi)容逐段讀取后寫入輸出流,直到文件結(jié)尾。
byte[] buffer = new byte[4096]; // 設置每次讀取的字節(jié)大小
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.flush(); // 確保數(shù)據(jù)被全部寫入輸出流
} catch (IOException e) {
e.printStackTrace();
}finally {
//關(guān)閉輸入/輸出流和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();
}
}
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot編譯target目錄下沒有resource下的文件踩坑記錄
這篇文章主要介紹了SpringBoot編譯target目錄下沒有resource下的文件踩坑記錄,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
一口氣說出Java 6種延時隊列的實現(xiàn)方法(面試官也得服)
這篇文章主要介紹了一口氣說出Java 6種延時隊列的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-05-05
基于Redisson實現(xiàn)注解式分布式鎖的示例代碼
這篇文章主要為大家詳細介紹了如何基于Redisson實現(xiàn)注解式分布式鎖,文中的示例代碼講解詳細,具有一定的參考價值,需要的可以了解一下2023-07-07

