Minecraft “End of stream” hatası, oyunun içinde bir şeyin bozulduğunu değil, ağ bağlantısının karşı taraftan kapatıldığını bildirir. Minecraft’ın ağ katmanı, TCP kanalının düzgün bir bağlantı kesme paketi gelmeden aniden kapandığını fark ettiğinde bu mesajı üretir. Yani ortada bir hata değil, bir sonuç var: karşı taraf gitti.
Bu yüzden mesaj tek başına hiçbir şey söylemez. Sunucunun çökmesi de, bir DDoS filtresinin bağlantıyı sessizce düşürmesi de, oyuncunun modeminin yeniden başlaması da aynı metni üretir. Teşhis, mesajı okumakla değil, kopmanın saatini loglarla eşleştirmekle yapılır. Aşağıda mesajın tam anlamını, sunucu ve istemci tarafındaki sebepleri, proxy yapılandırmasından kaynaklanan klasik tuzağı ve sırayla uygulanacak bir eleme listesini bulacaksınız. İçerik Minecraft 26.2 “Chaos Cubed” ve Paper 26.2 dönemine göre yazıldı.
“End of Stream” Tam Olarak Ne Anlatır?#
Oyuncunun ekranında görünen metin kısacıktır:
End of stream
Internal Exception: java.io.IOException: An existing connection was forcibly closed by the remote host
İlk metin Minecraft’ın dil dosyasındaki disconnect.endOfStream anahtarından gelir. İkincisi ise aynı olayın Windows istemcilerinde daha sık görülen varyantıdır. Her ikisi de tek bir şeyi anlatır: veri akışı bitti, kanal kapandı, karşı taraf artık yok.
Sunucu tarafında aynı olayın karşılığı logs/latest.log içinde şuna benzer:
[22:07:41] [Server thread/INFO]: Batihost_Emre lost connection: End of stream
[22:07:41] [Server thread/INFO]: Batihost_Emre left the game
[22:07:42] [Netty Server IO #2/WARN]: Failed to read packet, disconnecting client
Kim Kapattı? İki Yönlü Okuma#
Çözüme başlamadan önce iki soruya cevap verin. Cevaplar üç dakikada alınır ve tüm yönü belirler.
Tek oyuncu mu düşüyor?#
- Kendi internet bağlantısı ya da Wi-Fi kalitesi
- VPN, proxy veya antivirüs yazılımı
- İstemci tarafındaki modlar
- Oyuncunun ISP’si ile veri merkezi arasındaki yol
Herkes aynı anda mı düşüyor?#
- Sunucu süreci çöktü ya da yeniden başladı
- Bellek tükendi, JVM öldürüldü
- Proxy ile alt sunucu arasındaki bağ koptu
- Güvenlik duvarı veya DDoS filtresi devreye girdi
İkinci soru: sunucu hâlâ ayakta mı? Oyuncular düştükten sonra sunucu listesinde görünmeye devam ediyorsa süreç yaşıyordur ve kopma ağ yolundadır. Sunucu da listeden kaybolduysa süreç ölmüştür; artık bir bağlantı sorunu değil, bir çökme sorunu araştırıyorsunuz demektir.
Sunucu Tarafındaki Sebepler#
Sunucu kaynaklı End of stream vakalarının neredeyse tamamı dört başlıkta toplanır.
1. Süreç çöktü#
Sunucu jar’ı bir istisna nedeniyle kapandıysa açık olan tüm TCP bağlantıları anında düşer ve her oyuncu End of stream görür. Çökme anında crash-reports/ klasöründe bir dosya oluşur:
ls -lt crash-reports/ | head -5
tail -n 60 logs/latest.log
Crash raporunun nasıl okunacağı, hangi bölümün gerçek nedeni verdiği ayrı bir konu; adım adım yöntem crash report okuma rehberinde anlatıldı. Bir varlık işlenirken çökme oluyorsa Ticking Entity sayfası daha hedefli bir yol sunar.
2. Bellek tükendi#
Heap dolduğunda iki şey olabilir: JVM OutOfMemoryError fırlatıp kilitlenir ya da işletim sistemi süreci öldürür. İkincisi Linux’ta özellikle sinsidir, çünkü sunucu logunda hiçbir iz bırakmaz:
sudo dmesg -T | grep -i "killed process"
sudo journalctl -u minecraft -n 200 --no-pager | grep -iE "oom|killed|exit"
Servis çıkış kodu 137 ise süreç SIGKILL ile öldürülmüştür; bu neredeyse her zaman bellek yetersizliği demektir. Heap ayarlarını paketinize göre verin: 8 GB pakette -Xms6G -Xmx6G, 12 GB pakette -Xms10G -Xmx10G, 16 GB pakette -Xms14G -Xmx14G. Xms ve Xmx daima eşit olmalıdır, ayrıntılar RAM ve JVM flag ayarları sayfasında. Hata metnini birebir gördüyseniz Out of Memory sayfası daha ayrıntılıdır.
3. Yeniden başlatma betiği#
Zamanlanmış yeniden başlatmalar oyunculara düzgün bir kapanma mesajı gösterir (“Server closed”). Ama betik sunucuyu /stop yerine kill -9 ile öldürüyorsa oyuncular End of stream görür ve üstelik dünya dosyaları bozulma riskine girer. Bu yaygın bir yapılandırma hatasıdır.
kill -9 ile durdurmayın. Chunk yazımı yarıda kalır, region dosyaları bozulur. Doğru kapatma konsolda /stop komutudur; screen oturumundaysanız screen -S mc -X stuff "stop$(printf '\r')" kullanın.4. Ana thread kilitlendi#
Sunucu teknik olarak yaşıyor ama bir eklenti ya da mod ana thread’i bloke ediyorsa keep-alive paketleri cevapsız kalır ve bağlantılar toplu hâlde düşer. Watchdog devreye girip süreci sonlandırdığında ise herkes aynı anda End of stream görür. Bu senaryoda Watchdog crash sayfasındaki thread dump okuma yöntemi işinizi görür.
Proxy ve IP Forwarding Uyuşmazlığı#
BungeeCord ya da Velocity kullanan ağlarda End of stream vakalarının en büyük kaynağı budur. Proxy ile alt sunucu farklı yöntemlerle konuşmaya çalışır, el sıkışma çözülemez ve alt sunucu bağlantıyı kapatır. Oyuncu bunu End of stream olarak görür.
Velocity’nin modern forwarding modunda üç şeyin aynı anda doğru olması gerekir:
# Alt sunucu — server.properties
online-mode=false
server-ip=127.0.0.1
server-port=25566
# Alt sunucu — config/paper-global.yml
proxies:
bungee-cord:
online-mode: true
proxy-protocol: false
velocity:
enabled: true
online-mode: true
secret: 'velocity-forwarding-secret-degeri'
# Proxy — velocity.toml
player-info-forwarding-mode = "modern"
forwarding-secret-file = "forwarding.secret"
BungeeCord kullanıyorsanız denklem farklıdır: proxy tarafında config.yml içinde ip_forward: true, alt sunucuda ise spigot.yml içinde settings.bungeecord: true olmalıdır. İki sistemi karıştırmak — yani Velocity’yi modern moda alıp alt sunucuda BungeeCord anahtarını açmak — klasik hatadır ve tam olarak bu mesajla sonuçlanır.
| Proxy | Proxy tarafı ayarı | Alt sunucu ayarı | online-mode |
|---|---|---|---|
| Velocity (modern) | player-info-forwarding-mode = "modern" | proxies.velocity.enabled: true + aynı secret | false (alt sunucuda) |
| Velocity (legacy) | player-info-forwarding-mode = "legacy" | settings.bungeecord: true (spigot.yml) | false (alt sunucuda) |
| BungeeCord | ip_forward: true | settings.bungeecord: true (spigot.yml) | false (alt sunucuda) |
| Proxy yok | — | — | true |
online-mode=false yalnızca o sunucular dış dünyaya kapalıysa güvenlidir. 25566, 25567 gibi alt sunucu portlarını güvenlik duvarıyla kapatın; aksi hâlde herkes istediği nickle doğrudan girebilir. Ayarın anlamı ve riskleri için online-mode sayfasını, kurulum sırası için proxy kurulum rehberini okuyun.İstemci Tarafındaki Sebepler#
Sadece belirli oyuncular düşüyorsa ve sunucu logunda başka hiçbir uyarı yoksa sorun büyük olasılıkla istemci tarafındadır:
- Ağ kesintisi: modem yeniden başlar, Wi-Fi kanal değiştirir, mobil bağlantı hücre değiştirir. Kısa bir kesinti bile TCP oturumunu düşürür.
- VPN ve proxy: tünel yenilenirken oturum kopar. Ayrıca düşük MTU değerleri büyük chunk paketlerini engeller.
- Antivirüs ve güvenlik yazılımları: Java sürecinin giden bağlantısını “şüpheli” sayıp kesebilir. Java’yı istisna listesine ekleyin.
- Modlar: ağ paketine dokunan istemci modları (özellikle eski sürüm için derlenmiş olanlar) yarım paket üretip kanalı kapatabilir.
- Yanlış adres veya port: Minecraft dışı bir servise bağlanmak da tam olarak bu mesajı verir; servis bağlantıyı hemen kapatır.
Hızlı test yöntemi basit: oyuncu mobil veri üzerinden bağlansın. Sorun kalkıyorsa suçlu kendi ağıdır. Aynı ağdan başka bir sunucuya sorunsuz giriliyorsa suçlu yol üzerindeki bir cihazdır.
Güvenlik Duvarı ve DDoS Filtresi Kaynaklı Kesintiler#
Bu sebep, log tarafında hiçbir iz bırakmadığı için en geç fark edileni. Filtre bağlantıyı düşürdüğünde ne sunucu ne istemci bir hata yazar; yalnızca akış biter. Sunucu logunda kopma anında hiçbir uyarı yoksa buraya bakın.
- Bağlantı hızı limitleri: kısa sürede çok sayıda bağlantı açan IP’ler engellenir. Sunucu tarayıcıları ve bot saldırıları meşru oyuncuları da kapsayan kurallar tetikleyebilir.
- Yanlış imza kuralları: katman 7 filtreleri Minecraft paketlerini tanımıyorsa geçerli trafiği düşürebilir.
- Coğrafi engelleme: bazı lokasyon dışı IP blokları varsayılan olarak reddedilir.
- Sunucu tarafı güvenlik duvarı: UFW, firewalld veya Windows Defender kuralı 25565 dışındaki bir portu kapatıyorsa alt sunucular ve proxy birbirine ulaşamaz.
# Portun gerçekten dinlendiğini doğrulayın
sudo ss -tulpn | grep 25565
sudo ufw status numbered
Get-NetTCPConnection -LocalPort 25565 -State Listen
Get-NetFirewallRule -DisplayName "*Minecraft*" | Format-Table DisplayName,Enabled,Direction,Action
Koruma tarafındaki kural yapısı ve filtre seviyeleri için DDoS koruması sayfasına bakın. Kural değişikliği yapmadan önce mevcut kuralların yedeğini alın; yanlış bir kural tüm oyuncuları dışarıda bırakır.
Sürüm ve Protokol Uyuşmazlığı#
İstemci ile sunucu farklı protokol sürümündeyse normalde net bir “Outdated” mesajı görürsünüz. Ama araya bir çeviri katmanı girdiğinde tablo değişir: ViaVersion zinciri paketleri dönüştüremezse kanal kapanır ve oyuncu End of stream görür. 26.2 protokol 776, 26.1 ise 775 kullanır.
| Sürüm | Protokol | Gerekli Java | Durum |
|---|---|---|---|
| 26.2 “Chaos Cubed” | 776 | Java 25 | Güncel kararlı |
| 26.1 “Tiny Takeover” | 775 | Java 25 | Desteklenen |
| 1.20.5 – 1.21.11 | Sürüme göre değişir | Java 21 | Eski hat |
| 1.16.5 ve öncesi | Sürüme göre değişir | Java 8 | Eskimiş |
Farklı istemci sürümlerini kabul ediyorsanız çeviri katmanını güncel tutun. Kurulum ve uyumluluk tablosu ViaVersion sayfasında; birebir sürüm hatası metinleri ise Outdated Server / Outdated Client sayfasında duruyor.
Bağlantılar resmî kaynaklara gider. Üçüncü taraf sitelerden jar indirmeyin.
latest.log’da Eşzamanlı Satırı Bulma#
Teşhisin can alıcı adımı bu. Amaç, kopmanın saatini bulup aynı saniyedeki diğer satırları okumak. Şöyle ki: End of stream satırının kendisi hiçbir şey anlatmaz, ondan hemen önceki 20-30 satır herşeyi anlatır.
-
Kopma satırlarını listeleyin#
grep -n "lost connection" logs/latest.log | tail -30Windows tarafında aynı iş için:
Select-String -Path .\logs\latest.log -Pattern "lost connection" | Select-Object -Last 30 -
O saniyenin çevresini okuyun#
Bulduğunuz satır numarasının 30 satır öncesinden itibaren okuyun. Aradığınız şey bir istisna, uzun bir GC duraklaması ya da bir eklenti uyarısı.
sed -n '4180,4240p' logs/latest.log grep -nE "ERROR|WARN|Exception|keep up" logs/latest.log | tail -40 -
Sıkıştırılmış eski logları da tarayın#
Sunucu her gün logu arşivler. Olay dünse
logs/klasöründeki.log.gzdosyalarına bakın.zgrep -h "lost connection: End of stream" logs/*.log.gz | tail -40 -
Sistem tarafını kontrol edin#
Sunucu logunda hiçbir iz yoksa süreç dışarıdan öldürülmüş olabilir.
sudo journalctl -u minecraft --since "1 hour ago" --no-pager sudo dmesg -T | tail -50
Log dosyalarının yapısı, hangi etiketlerin ne anlama geldiği ve zaman damgalarının nasıl okunacağı log okuma rehberinde ayrıntılı anlatıldı.
Sırayla Eleme Kontrol Listesi#
Aşağıdaki sırayı bozmadan uygulayın. Her adım bir olasılık grubunu tamamen eler; sıçrayarak ilerlemek zaman kaybettirir.
| # | Kontrol | Sonuç “evet” ise |
|---|---|---|
| 1 | Sunucu süreci hâlâ çalışıyor mu? | Çökme elendi, ağ tarafına geçin |
| 2 | crash-reports/ içinde yeni dosya var mı? | Çökme sebebini rapordan okuyun |
| 3 | Çıkış kodu 137 mi, dmesg’de OOM izi var mı? | Bellek yetersiz, heap ve paket boyutunu artırın |
| 4 | Kopma anında logda istisna veya GC duraklaması var mı? | Eklenti/mod tarafına odaklanın |
| 5 | Proxy kullanıyor musunuz? | Forwarding modu ve secret değerini doğrulayın |
| 6 | Sadece belirli oyuncular mı düşüyor? | İstemci ağı, VPN, mod ve antivirüs |
| 7 | Logda hiçbir iz yok ama herkes düşüyor mu? | Güvenlik duvarı veya DDoS filtresi |
| 8 | Temiz kurulumda (eklentisiz) tekrar ediyor mu? | Sorun altyapıda; etmiyorsa eklentilerde |
İlgili Hata Sayfaları#
- Internal Exception hatası — aynı ağ katmanının farklı bir belirtisi.
- io.netty hataları — zaman aşımı ve okuma hatalarının birebir metinleri.
- Connection Timed Out hatası — bağlantı hiç kurulamadığında.
- Tüm Minecraft sunucu hataları — kategori pillar rehberi.
Özetle#
End of stream bir arıza adı değil, bir gözlemdir: bağlantı karşı taraftan kapandı. Doğru teşhis için önce mesajı kimin gördüğünü belirleyin, sonra kaç kişinin etkilendiğine bakın, ardından logs/latest.log içinde kopma saatiyle aynı saniyedeki satırları okuyun. Sunucu tarafında çökme, bellek tükenmesi ve proxy forwarding uyuşmazlığı; istemci tarafında ağ kesintisi, VPN ve modlar ilk sıradadır. Logda hiçbir iz yokken herkesin düşmesi ise güvenlik duvarı ya da DDoS filtresini işaret eder. Bunları sırayla elediğinizde geriye tek bir sebep kalır — ve o noktada çözüm genellikle tek satırlık bir ayardır. Adımları uyguladığınız halde sonuç alamadıysanız log dosyanızla birlikte destek talebi açın.