Küçük demo programımda Sunucu ve İstemcim var. Burada istemci'den Sunucu'ya bir dizi dize veri gönderiyorum ve bundan sonra da bu verileri yeniden göndererek konsola yazıyor. PrtintWriter'ın sifon yöntemi ile kafam karışmıştı, ki bu da - JAVA belgelerine göre - akışı temizliyor. Bazı araştırmalardan sonra, autoflash kavramına aşinayım: autoFlash parametresi true olduğunda, printf, veya format yöntemleri çıktı arabelleğini temizler. Burada anlamadığım tek şey, neden PrintWriter'in floş yöntemini döngüde değil, döngüde kullanmasıdır. (Benim durumumda PrintWriter'i Sunucu tarafında kullanıyorum.) Autoflash, println() yöntemi de döngüde olduğu için aynı şeyi yapar. Döngüden sonra floş kullandığımda dize verilerim konsolda görünmez. Rehberlik ve şimdiden yardımlarınız için teşekkür ederiz!PrintWriter söz konusu olduğunda, döngüden sonra neden döngüde durmamalıyım?
Müşteri:
public class ClientDemo {
public static void main(String[] args) throws IOException {
final String CLIENTNAME = "<CLIENT>:";
final String SERVERADDRESS = "localhost";
final int PORT = 12312;
try {
Socket socket = new Socket(SERVERADDRESS, PORT);
PrintWriter out =
new PrintWriter(socket.getOutputStream(), true);
Scanner scanner = new Scanner(socket.getInputStream());
System.out.println(CLIENTNAME + "Client starts");
List<String> lista = getList();
for(String userInput : lista){
out.println(userInput);
System.out.println("echo: " + scanner.nextLine());
}
} catch(IOException e) {
System.out.println(CLIENTNAME + "Error connecting to the server:" + e.getMessage());
}
}
private static List<String> getList(){
List<String> result = new ArrayList<>();
result.add("egy");
result.add("ketto");
result.add("harom");
result.add("negy");
result.add("ot");
result.add("hat");
result.add("het");
result.add("nyolc");
result.add("kilenc");
result.add("tiz");
return result;
}
}
Sunucusu: Her satırı yazdıktan sonra floş aramak gerekmez
public class ServerDemo {
public static void main(String args[]) throws IOException {
final int PORT = 12312;
final String SERVERNAME ="<SERVER>:";
try {
ServerSocket serverSocket = new ServerSocket(PORT);
Socket socket = serverSocket.accept();
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
Scanner scanner = new Scanner(socket.getInputStream());
System.out.println(SERVERNAME + "Server starts...");
String inputLine;
while(scanner.hasNext()) {
inputLine = scanner.nextLine();
printWriter.println(inputLine);
printWriter.flush();
}
} catch (IOException e) {
System.out.println(SERVERNAME + "Error handleing client...");
}
}
}
Her şeyden önce cevabınız için teşekkür ederiz. İkincisi, I/O döngüsünü yıkayarak nasıl engelleyebilirim konusunda daha derin bir açıklama verebilir misiniz? Çünkü floş çizgisini kaldırırsam, String listesi konsolda görünmez. Öğretmenim aynı zamanda sifon yöntemini kullanmam konusunda da uyardı. Gördüğünüz gibi, benim örneğimde autofalsh veya close kullanmıyorum. Tekrar şimdiden teşekkürler! – F3R1
PrintWriter nesnesini, catch bloğunun hemen sonundaki bir son satırda kapatmaya çalışmalısınız. Şu anda PrintWriter kaynağını kapatmıyorsunuz. Kaynağı kapatırsanız, kapatmadan önce de temizleyecektir. Bu noktada, tampondaki tüm satırlar hedefe boşaltılır (yazılır). Son olarak bir bloğu eklemeye ve PrintWriter kaynağını kapatmaya çalışın. Konsoldaki çıkışı görmelisiniz. AutoClosable arabirimini uygulayan kaynakları kapatmak zorunda kalmamak için yeni Java 7 try-with-sources deyimini de kullanabilirsiniz. – VHS
Son olarak engellemedeki kaynağı kapatırsam ve kodun temizliğini kaldırırsam veya döngüden sonra taşıyamazsam, maalesef aynı hatayı yapar ve konsolu çıkışını göremiyorum. Kaynakla ilgili ifadeyi biliyorum, kodu onunla yeniden yazdım ve aynı belirti oluşur. Sızdırmazlık döngüde ise, çıkış konsoldan çıkar ... eğer döngüden çıkarılırsa veya döngüden sonra çıktıyı göremiyorum. (Bu arada yardımın için teşekkür ederim. Sana oy verdim. Büyülü 15 yüksek itibar kazandıktan sonra bunu göreceksin. :)) – F3R1