PDA

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



ail313
چهارشنبه 01 شهریور 1391, 19:47 عصر
سلام
قصد دارم که یه برنامه ویندوزی و یک برنامه ی آندرویدی بنویسم که این دو بتونند با هم از طریق شبکه ارتباط داشته باشند. به ارتباط بین اونها از سوکت استفاده کردم.
ولی به یه مشکل عجیب بر خورد کردم . اونم اینه که همین که توی برنامه ی آندرویدی (به عنوان کلاینت) سوکت ساخته میشه و کانکت میشه ، سرور(برنامه ی ویندوزی ) شروع به دریافت داده ی "0\" میکنه وحتی اگه من برنامه ی آندروید رو ببندم و اتصال شبکه رو هم قطع کنم ، دریافت داده در برنامه ی سرور متوقف نمیشه.

من با سی شارپ و پایتون هم یه برنامه ی کلاینت ساده نوشتم ، با اونها چنین مشکلی نداشتم و برنامه ی سرور به خوبی کار میکرد.

این کد برنامه ی سرور به زبان سی شارپه:
private void listen_Btn_Click(object sender, EventArgs e)
{
try
{
_socket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any, port);
// Bind to local IP Address...
_socket.Bind(ipLocal);
// Start listening...
_socket.Listen(4);
// Create the call back for any client connections...
_socket.BeginAccept(new AsyncCallback(OnClientConnect), null);
}
catch (Exception ee)
{
MessageBox.Show(ee.Message);
}

}

// This is the call back function, which will be invoked when a client is connected
public void OnClientConnect(IAsyncResult asyn)
{
try
{
Socket workerSocket = _socket.EndAccept(asyn);
_socket.BeginAccept(new AsyncCallback(OnClientConnect), null);
Interlocked.Increment(ref m_clientCount);
m_workerSocketList.Add(workerSocket);
clientsName.Add("$unknown$");
if (listBox1.InvokeRequired)
{
listBox1.Invoke(new MethodInvoker(delegate { listBox1.Items.Clear(); foreach (string name in clientsName) listBox1.Items.Add(name); }));
}
ArrayList rthreadParams = new ArrayList();
rthreadParams.Add(workerSocket);
rthreadParams.Add(m_clientCount);
Thread rThread = new Thread(new ParameterizedThreadStart(WaitForData));
rThread.Start(rthreadParams);
rThread.Join();

}
catch (ObjectDisposedException)
{
System.Diagnostics.Debugger.Log(0, "1", "\n OnClientConnection: Socket has been closed\n");
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
}

public class SocketPacket
{
public Socket m_currentSocket;
public int m_clientNumber;
public SocketPacket(Socket socket, int clientNumber)
{
m_currentSocket = socket;
m_clientNumber = clientNumber;
}
public byte[] dataBuffer = new byte[1024];
}
public void WaitForData(object param)
{
try
{
Socket soc = (Socket)((ArrayList)param)[0];
int clientNumber = (int)((ArrayList)param)[1];
if (pfnWorkerCallBack == null)
{
pfnWorkerCallBack = new AsyncCallback(OnDataReceived);
}
SocketPacket theSocPkt = new SocketPacket(soc, clientNumber);

soc.BeginReceive(theSocPkt.dataBuffer, 0, theSocPkt.dataBuffer.Length,
SocketFlags.None, pfnWorkerCallBack, theSocPkt);
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
}
public void OnDataReceived(IAsyncResult asyn)
{
SocketPacket socketData = (SocketPacket)asyn.AsyncState;
try
{
int iRx = socketData.m_currentSocket.EndReceive(asyn);
char[] chars = new char[iRx + 1];
System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
d.GetChars(socketData.dataBuffer, 0, iRx, chars, 0);
String szData = new String(chars);
szData = szData.Replace("\0", "");

// doing some work with szData

ArrayList t_Params = new ArrayList();
t_Params.Add(socketData.m_currentSocket);
t_Params.Add(socketData.m_clientNumber);
WaitForData(t_Params);

}
catch (Exception ee)
{

}
}

توی برنامه ی آندروید هم به این صورت ارتباط برقرار میکنم:

try
{
InetSocketAddress sa = new InetSocketAddress("192.168.50.11", 2001);
Socket socket = new Socket();
socket.connect(sa,4000);


OutputStream dos = socket.getOutputStream();
PrintWriter out = new PrintWriter(dos);
out.write("hello");
out.flush();
out.close();
socket.close();
}
catch (Exception e)
{
Log.d(appTag, e.toString());
}