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 veriSunucu 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 veriSunucu 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();
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
@CodeCaster Aldığım tam bir veri. ve aynı verileri okuyarak. Verileri sadece bir kez okumak için normal durumda engellenir. – nyconing
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