[英]Close socket connection after receiving stream - java
我制作了一個tcp服務器,該服務器從客戶端獲取文件名,並讀取服務器上文件的內容,然后將其流回客戶端。
我還讓客戶端來接收文件。 我的問題是在客戶端上收到文件后,如何終止循環,以便可以關閉連接?
這是服務器代碼:
import java.io.*;
import java.net.*;
import java.util.*;
public class WebTCPServer_file {
public static void main(String argv[]) throws Exception{
String request;
ServerSocket welcomeSocket = new ServerSocket(6790); //opening socket
while(true){
Socket connectionSocket = welcomeSocket.accept();
Scanner inFromClient = new Scanner(connectionSocket.getInputStream());
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
request = inFromClient.nextLine(); //client request
System.out.println("Received: "+request);
/*dividing request command*/
String reqMeth = request.substring(0, 3);
String reqURL = request.substring(5, (request.lastIndexOf("HTTP/1.1")));
String reqProto = request.substring(request.indexOf("HTTP/1.1"));
System.out.println("Request Method:\t" +reqMeth +"\nRequest URL:\t" +reqURL+ "\nRequest Protocol: " +reqProto);
File localFile = new File(reqURL.trim());
FileReader in = new FileReader(localFile);
BufferedReader inBuff = new BufferedReader(in);
String c;
while((c = inBuff.readLine())!=null){
outToClient.writeBytes(c + '\n');
System.out.println(c);
} //END while
outToClient.flush();
in.close();
} //END while(true)
} //END main
} //END class
這是客戶端代碼:
import java.io.*;
import java.net.*;
import java.util.*;
public class TCPClient_file {
public static void main(String[] args) throws Exception{
String sentence ;
Scanner inFromUser = new Scanner(System.in);
Socket clientSocket = new Socket("192.168.0.16", 6790);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(
new InputStreamReader(
clientSocket.getInputStream()));
sentence = inFromUser.nextLine();
outToServer.writeBytes(sentence + '\n');
String serverfile;
while ((serverfile = inFromServer.readLine()) != null)
System.out.println(serverfile);
inFromServer.close();
outToServer.close();
clientSocket.close();
} //END main
} //END class
來自服務器的客戶端請求:
GET /domains.txt HTTP/1.1
其中“ domains.txt”是服務器上包含網站列表的文件。
while循環不會終止,因為inFromServer
需要更多數據。 您需要在服務器端關閉連接( outToClient
),以便客戶端可以確保不再有其他數據。
實現此目的的一個粗略方法是發送觸發器[來自服務器的字符串],將所有數據發送到客戶端后,表明文件傳輸已完成,在客戶端可以檢查該字符串,並且在接收到該字符串后就可以退出該觸發器您的while循環並可以關閉連接。
另一個更好的方法是,在服務器端發送實際文件內容之前,先發送文件的大小,然后再發送實際文件數據,在客戶端,一旦讀取的字節等於先前發布的大小,就跟蹤讀取的字節您可以終止while循環
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.