2016-04-06 41 views
0

Java (istemci) ve C# (Sunucu) TCP Soketi'nden sonsuz son veri okudu. ve Sunucu istemci (Java) gelen sonsuz son veri okumak zaten bütün gün için aradı, onun tuhaf.Java (istemci) ve C# (Sunucu) TCP Soketi. ve Sunucu, istemciden

Ben 2 müşteri oluşturuldu: (gerçek) Java, C# böyle (test için):

Java (Gerçek):

System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient(); 
clientSocket.Connect("192.168.0.138", 11838); 
NetworkStream serverStream = clientSocket.GetStream(); 
byte[] outStream = System.Text.Encoding.ASCII.GetBytes(textBox2.Text + "$"); 
serverStream.Write(outStream, 0, outStream.Length); 
serverStream.Flush(); 
(test için)

Socket socket = new Socket(SyncActivity.ip,SyncActivity.port); 
DataOutputStream out; 
out = new DataOutputStream(socket.getOutputStream()); 
String s = "Hello!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$"; 
out.write(s.getBytes(),0,s.getBytes().length); 
out.flush(); 
s = "Yes this another data$"; 
out.write(s.getBytes(),0,s.getBytes().length); 
out.flush(); 
socket.shutdownInput(); 
socket.shutdownOutput(); 
socket.close(); 
Thread.currentThread().interrupt(); 

ve C#

C# (test) tarafında, bir veriyi sunucuya gönderdi ve sunucu bir kez veri okudu ve başka bir veri beklemek için engellendi. Bunu sevdim.

Java (Real) tarafında, iki veriyi bir defa okurken sunucuya ve sunucuya iki veri gönderdikten sonra aynı 2. veriyi sonsuza kadar okuyun. Java tarafı sadece bir kez gönderilir.

Aldığım tam bir veri. Niye ya? bu garip.

Sonuç olarak: C# (test)

Müşteri talep bağlantı

.

Sunucu kabul ve bağlantı oluşturdu.

Sunucu Oku deneyin (ve Engellenen)

Müşteri gönderme >>

Sunucu alınan TextBox >> TextBox

Sunucusu (

ancak Java Read deneyin (ve Engellenen) Gerçek):

İstemci isteği iyon.

Sunucu kabul ve bağlantı oluşturdu.

Sunucu Oku (ve Engellenen)

Müşteri gönderme >> Merhaba deneyin !!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Sunucu alındı ​​>> Merhaba !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!

Müşteri gönderme >>

Sunucu alınan

Evet bu başka bir veri

Sunucu Oku deneyin >> Evet bu başka bir veri

Sunucu denemek

Sunucu alınan Oku >> Evet bu başka bir veri

Sunuculamayı dene Okumaya devam et

Sunucu >> Evet bu başka bir veri

Sunucu

Sunucu alınan Oku deneyin >>

Sunucu alınan

Evet bu başka bir veri

Sunucu Oku deneyin >> alınan Evet bu başka bir veri

Sunucu >>

Sunucu alınan Evet bu başka veri okuma denemek

(ve sonsuza ve sonsuza)

Sunucu kodu:

TcpListener serverSocket = new TcpListener(IPAddress.Any, Convert.ToInt16(Ini.IniReadValue("About", "ServerPort", "MVS_VAN.info"))); 
    TcpClient clientSocket = default(TcpClient); 
    serverSocket.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 
    serverSocket.Start(); 
    clientSocket = serverSocket.AcceptTcpClient(); 
    serverSocket.Stop(); 
    NetworkStream networkStream = clientSocket.GetStream(); 
    byte[] bytesFrom = new byte[128000]; 
    do 
    { 
         Socket soc = clientSocket.Client; 
         soc.Receive(bytesFrom); 
         string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom); 
         dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$")); 
         MessageBox.Show("", dataFromClient); 
         networkStream.Flush(); 

        //networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize); 
        //string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom); 
        //dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$")); 
        //tried^this 3 line also. 

        } while ((true)); 
    clientSocket.Close(); 
    serverSocket.Stop(); 
+0

Hayır, bu tuhaf değildir. TCP bir akış protokolüdür. Bir 'Gönder()' 'Receive()' ile aynı değildir. Okumaya devam etmeli, 'Receive()' tarafından döndürülen değeri göz ardı etmemeli ve tüm mesajı aldığınızı bilene kadar arabellek eklemeye devam etmelisiniz. – CodeCaster

+0

@CodeCaster Aldığım tam bir veri. ve aynı verileri okuyarak. Verileri sadece bir kez okumak için normal durumda engellenir. – nyconing

+0

Evet Ne demek istediğin hakkında hiçbir fikrim yok. Bu kod bozuktur, ne yaptığınızı bilmiyorsanız yuva kullanmamalısınız, ancak HTTP gibi bir üst düzey protokol kullanın. – CodeCaster

cevap

-2

Im günde araştırmak sonra problemin ne olduğunu gördük.

ama onun hala garip:

socket.close();//<--here causing a start of server read same last data infinitly 

düzgün kapatmadan edilmedi:

Java Client üzerinde. belki protokol hala sunucuya geldi edilir tüm paketleri sağlamak için devlet CLOSE_WAIT nerede?

.

sahte gidermek:

Im kendi komutan paketleri "cmd_request_close_connection" gibi sunucuya göndermek yazma ve sunucu böyle paket aldığınızda sunucu tarafında bağlantı kapatın.

+0

Kendi cevabım, yarın benim sorunumsa, sorunun nasıl devam ettiğini açıklamak için başka hiçbir en iyi cevabı kabul etmem. – nyconing

+0

Bu sorun değil. Sorun, alıcının akışın sonunu görmezden gelmesidir. CLOSE_WAIT, bununla bir ilgisi yoktur, ancak sunucunun EOS'u göz ardı ettiğini kanıtlar. – EJP

0

sunucu Receive() tarafından döndürülen sayısını göz ardı edilir. Bu nedenle (a) akışın endi göz ardı edilmesi ve (b) tamponda geçersiz verilerin işlenmesidir.

İlgili konular