Skip to content Skip to sidebar Skip to footer

Server Remains Hang When Sending

I'm writting a client(Android) - server(c#) application. I get the code from here: How to make client on Android listen to server on C#? Everythings is working fine, when i just se

Solution 1:

The reason you get the dispose error is because the s.close() closes the socket, and then your next s.Receive() is trying to read from a closed socket.

Also the hang you are seeing might be caused by in.close(); in your java code. It could be closing the underlying socket. Try commenting it out and see if that fixes your hanging problem.

Not an expert in C#, but I've done my share of socket programming.

Basically what you want is 1 + n threads.

One thread that just accepts connections.

For each socket that is returned by Socket s = myList.AcceptSocket(); you want a thread for sending/receiving data and processing the messages from the socket. You could also use two threads (one that sends, one that receives (this is the asynchronous case)).

Solution 2:

You should use the stream of the tcp client.. an example can be found here: http://msdn.microsoft.com/de-de/library/system.net.sockets.tcplistener.aspx

And don't use goto, please. You will never reach the end lines after goto m; Surround the code with a while loop which checks if an timeout is occured or any other checks.

The reason why the server hangs is that he waits for 100 bytes to receive.

Solution 3:

The problem was that when the client received the message from the server , in the while part entered into an infinite loop. I modify my app like this:

My client part:

try 
        {
            Toast.makeText(context,"IP: "+ip+" port: "+port,10000).show();
            InetAddressserverAddr= InetAddress.getByName(ip); 
            socket = newSocket(serverAddr, port);
        } 
        catch (UnknownHostException e1) 
        {
            Toast.makeText(context,"UnknownHostException ",10000).show();
        } 
        catch (IOException e1) 
        {
            Toast.makeText(context,"IOException ",10000).show();
        }

        Stringmessage="HELLO FROM CLIENT";

        PrintWriterout=null;
        BufferedReaderin=null;

        try { 
            Log.d("TCP", "C: Sending: '" + message + "'"); 

            /*write*/
            OutputStream ostr=socket.getOutputStream();
            OutputStreamWriter outputstr=newOutputStreamWriter(ostr);
            BufferedWriter buffw=newBufferedWriter(outputstr);
            out = newPrintWriter(buffw ,true);
            out.println("HELLO 1 FROM CLIENT");

            /*read - i modify to this*/
            InputStreamReader reader=newInputStreamReader(socket.getInputStream());
            char[] bytesreceived=newchar[50];
            reader.read(bytesreceived    , 0, 50);
            String text="";
            for (int i=0;i<bytesreceived.length;i++)
            {
                text+=bytesreceived[i];
            }
            Toast.makeText(context, "Received1: "+text.trim(), 10000).show();
            Log.d("IdealLog","Received1: "+text.trim());

            /*write*/
            out = newPrintWriter( newBufferedWriter( newOutputStreamWriter(socket.getOutputStream())),true);
            out.println("HELLO 2 FROM CLIENT");

            /*read*/
            reader=newInputStreamReader(socket.getInputStream());
            bytesreceived=newchar[50];
            reader.read(bytesreceived    , 0, 50);
            text="";
            for (int i=0;i<bytesreceived.length;i++)
            {
                text+=bytesreceived[i];
            }
            Toast.makeText(context, "Received2: "+text.trim(), 10000).show();
            Log.d("IdealLog","Received2: "+text.trim());

        } catch(Exception e) { 
            Log.e("TCP", "S: Error", e); 
        } finally { 
            try {
                socket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
        } 

My server side code:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespaceSocketServer
{
    classProgram
    {
        staticvoidMain(string[] args)
        {
            IPEndPoint ip = new IPEndPoint(IPAddress.Any, 18001);
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            socket.Bind(ip);
            socket.Listen(10);
            Console.WriteLine("Waiting for a client...");
            Socket client = socket.Accept();
            IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
            Console.WriteLine("Connected with {0} at port {1}", clientep.Address, clientep.Port);



            string welcome = "HELLO 1 FROM SERVER";
            byte[] data = newbyte[200];
            int receiveddata=client.Receive(data);
            Console.WriteLine("Received data from CLIENT1: {0}", System.Text.ASCIIEncoding.ASCII.GetString(data).Trim());



            ASCIIEncoding asen = new ASCIIEncoding();
            byte[] data2 = newbyte[200];
            data2 = asen.GetBytes(welcome);
            int sentdata=client.Send(data2, data2.Length, SocketFlags.None);
            Console.WriteLine("Sent data from SERVER: {0}", welcome);



            byte[] data3 = newbyte[200];
            Console.WriteLine("Receiving data from CLIENT : {0}", "...");
            client.Receive(data3);


            Console.WriteLine("Received data from CLIENT2: {0}", System.Text.ASCIIEncoding.ASCII.GetString(data3).Trim());
            byte[] data4 = newbyte[200];
            data4 = asen.GetBytes("HELLO 2 FROM SERVER");
            sentdata = client.Send(data4, data4.Length, SocketFlags.None);

            client.Close();
            socket.Close();


            Console.WriteLine("Disconnected from {0}", clientep.Address);



            Console.ReadLine();
        }
    }
}

Now, everything is working fine, without hang. The only problem is, that i don't know if this will work for receiving , sending files.

Post a Comment for "Server Remains Hang When Sending"