PDA

View Full Version : سوال: مشکل در برنامه سوکت بین C#‎‎‎‎‎ و اندروید



sds1920
چهارشنبه 30 مهر 1393, 12:06 عصر
سلام به همه.
دقیقا نمی دونستم این سوالو اینجا مطرح کنم یا توی قسمت اندروید.چون به هر دوش مربوط هست.
من یه برنامه با سوکت دارم می نویسم که سرور اون سی شارپ هست و کلاینت اون اندروید.همه کار ها درست انجام میشه تا وقتی که بخوام سوکت رو از طرف اندروید close کنم.

وقتی که سوکت رو close می کنم توی سرور نشونه ای مبنی بر اینکه سوکت بسته شده وجود نداره و از زمان بسته شدن سوکت در اندروید سرور پشت سر هم شروع می کنه به دریافت اطلاعات ولی تعداد بایتهایی که دریافت می کنه صفر هست.به نظر شما من از کجا باید بفهمم که کلاینتم کانکشن خودشو close کرده.
من نمونه کد هام رو در زیر قرار می دم از دوستان هرکس که میتونه کمک کنه.

نمونه کد های سرور در C#‎‎‎‎‎‎‎‎

class Program
{
private static int port = 4444;


private static Socket mainSocket;
private static Socket clientSocket;


static void Main(string[] args)
{
StartListen();

ConsoleKeyInfo key;
do
{ key = Console.ReadKey(true); }
while (key.KeyChar != 'e' && key.KeyChar != 'c');
}

private static void StartListen()
{
IPAddress serverIp = new IPAddress(new byte[] { 192, 168, 1, 100 });
IPEndPoint ipEndPoint = new IPEndPoint(serverIp, port);
EndPoint endPoint = ipEndPoint.Create(ipEndPoint.Serialize());


mainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);


try { mainSocket.Bind(endPoint); }
catch (Exception ex)
{
Console.WriteLine("Error in Binding Socket");
}

try
{
mainSocket.Listen(10);
string strIp = string.Empty;
Console.WriteLine("Listening On " + serverIp + ":" + port);
Console.WriteLine();
}
catch (Exception ex)
{
Console.WriteLine("Error in Start Listening");
}

new Thread(AcceptRequeste).Start();
}

private static void AcceptRequeste()
{
try
{
while (true)
{
clientSocket = mainSocket.Accept();
new Thread(ReceiveData).Start();
Console.WriteLine("Client Connected");
}
}
catch { }
}


private static void ReceiveData()
{
while (clientSocket.Connected)
try
{
byte[] buffer=new byte[10];
clientSocket.Receive(buffer);
foreach (byte b in buffer)
Console.WriteLine(b);
}
catch
{
}
}
}


نمونه کد های کلاینت در اندروید:


protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Thread thr = new Thread(createSocket);
thr.start();
}

Runnable createSocket = new Runnable()
{
@Override
public void run()
{
try
{
addr = InetAddress.getByName("192.168.1.100");
socket = new Socket(addr, 4444);
socketReceiver = socket.getInputStream();
socketSender = socket.getOutputStream();
new Thread(dataReceived).start();

} catch (Exception e)
{
}
}
};

Runnable dataReceived = new Runnable()
{
@Override
public void run()
{
while (socket.isConnected() && !socket.isClosed())
try
{
byte[] bts = new byte[10];
socketReceiver.read(bts);

} catch (Exception e)
{
}
}
};

public void btnClose_Click(View v)
{
try
{
socket.close();
} catch (Exception e)
{
}
}



زمانی که برنامه سمت کلاینت رو می بندم سرور مثل عکس زیر می شه:


124825

elec60
چهارشنبه 30 مهر 1393, 21:40 عصر
دقیقا از همین دریافت صفر به این نتیجه میرسی که سوکت بسته شده، چون اگه دیتایی نباشه و سوکت بسته نباشه متد به صورت Blocking عمل میکنه.

sds1920
چهارشنبه 30 مهر 1393, 21:44 عصر
دقیقا از همین دریافت صفر به این نتیجه میرسی که سوکت بسته شده، چون اگه دیتایی نباشه و سوکت بسته نباشه متد به صورت Blocking عمل میکنه.

آخه وقتی یه سوکت کلاینت که اونم مثل سرور با C# باشه رو Close می کنیم توی متد ReceiveData یک exception ایجاد می شه که نشونه بسته شده سوکت هست.

elec60
چهارشنبه 30 مهر 1393, 22:31 عصر
اره همین طوره، ولی وقتی کلاینت بسته بشه سمت سرور Exception اتفاق نمیوفته، چون این کلاینته که درخواست اتصال به سرور داده و سرور واسش مهم نیست که کلاینت کانکته یا بسته شده!(این مطلب علمی نیست از خودم گفتم)

شما شرط بزارین هر وقت تعداد صفر بایت دریافت شد یعنی کلاینت بسته شده. حالا Exception پرتاب نمیکنه که نمیکنه:لبخند: