Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 发送时服务器保持挂起状态_C#_Java_Android - Fatal编程技术网

C# 发送时服务器保持挂起状态

C# 发送时服务器保持挂起状态,c#,java,android,C#,Java,Android,我正在编写一个客户端(Android)-服务器(c#)应用程序。我从这里得到代码: 当我只是将消息从客户端发送到服务器,从服务器发送到客户端(关闭服务器端的套接字)时,一切都正常工作。现在,我想要的是:向服务器发送消息,从服务器接收消息,然后再次向服务器发送消息。服务器在发送消息时挂起。如果在发送后关闭服务器端的套接字,则会出现dispose错误,并且无法从服务器发送数据 我的服务器代码是: /*************************************SERVER********

我正在编写一个客户端(Android)-服务器(c#)应用程序。我从这里得到代码: 当我只是将消息从客户端发送到服务器,从服务器发送到客户端(关闭服务器端的套接字)时,一切都正常工作。现在,我想要的是:向服务器发送消息,从服务器接收消息,然后再次向服务器发送消息。服务器在发送消息时挂起。如果在发送后关闭服务器端的套接字,则会出现dispose错误,并且无法从服务器发送数据

我的服务器代码是:

/*************************************SERVER*****************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace SERVER2
{
    class Program
    {
        public static void Main()
        {
            try
            {
                IPAddress ipAd = IPAddress.Parse("192.168.2.102");

                TcpListener myList = new TcpListener(ipAd, 18001);

                myList.Start();

                Console.WriteLine("The server is running at port 18001...");
                Console.WriteLine("The local End point is  :" +
                                  myList.LocalEndpoint);
                Console.WriteLine("Waiting for a connection.....");
                 m:
                Socket s = myList.AcceptSocket();
                Console.WriteLine("Connection accepted from " + s.RemoteEndPoint);

                byte[] b = new byte[100];
                int k = s.Receive(b);

                char cc = ' ';
                string test = null;
                Console.WriteLine("Recieved1...");
                for (int i = 0; i < k - 1; i++)
                {
                    cc = Convert.ToChar(b[i]);
                    test += cc.ToString();
                }
                Console.WriteLine("Received characters1: "+test);

                ASCIIEncoding asen = new ASCIIEncoding();
                s.Send(asen.GetBytes("The string was recieved by the server."));
                Console.WriteLine("\nSent Acknowledgement");
                //s.Close(); <-if i enable this, i get a dispose error

                k = s.Receive(b);//i get dispose error here

                cc = ' ';
                test = null;
                Console.WriteLine("Recieved2...");
                for (int i = 0; i < k - 1; i++)
                {
                    cc = Convert.ToChar(b[i]);
                    test += cc.ToString();
                }
                Console.WriteLine("Received characters2: " + test);

                /* clean up */
                goto m;
                s.Close();
                myList.Stop();

            }
            catch (Exception e)
            {
                Console.WriteLine("Error..... " + e.Message);
            }
            Console.ReadLine();
        }

    }
}

感谢先进

您应该使用tcp客户端的流。。可以在此处找到一个示例:

请不要使用goto。 在
goto m之后,您将永远无法到达终点线
用while循环包围代码,该循环检查是否发生超时或任何其他检查


服务器挂起的原因是他等待100字节的接收。

出现dispose错误的原因是
s.close()
关闭套接字,然后您的下一个
s.receive()
正在尝试从关闭的套接字读取

另外,您看到的挂起可能是由.close()中的
引起的在java代码中。它可能正在关闭底层套接字。试着评论一下,看看这是否能解决你的悬而未决的问题

我不是C#方面的专家,但我已经完成了socket编程的部分工作

基本上你想要的是1+n个线程

一个只接受连接的线程


对于由
sockets=myList.AcceptSocket()返回的每个套接字
您需要一个线程来发送/接收数据并处理来自套接字的消息。您还可以使用两个线程(一个发送,一个接收(这是异步情况))。

问题是,当客户端从服务器接收消息时,while部分进入无限循环。我修改我的应用程序如下:

我的客户部分:

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

        String message = "HELLO FROM CLIENT";

        PrintWriter out = null;
        BufferedReader in = null;

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

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

            /*read - i modify to this*/
            InputStreamReader reader=new InputStreamReader(socket.getInputStream());
            char[] bytesreceived=new char[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 = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
            out.println("HELLO 2 FROM CLIENT");

            /*read*/
            reader=new InputStreamReader(socket.getInputStream());
            bytesreceived=new char[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();
            } 
        } 

现在,一切正常,没有挂断。唯一的问题是,我不知道这是否适用于接收、发送文件

我试图注释掉in.close()部分,但运气不好。该应用程序在发送时仍挂起。我应该将套接字s=myList.AcceptSocket()放在哪里?我试图像你说的那样使用流,但是当我发送消息时,它挂起在这一部分:stream.Write(msg,0,msg.Length);客户端没有写任何东西。如果我添加stream.close(),我会在while循环中得到一个已处理的错误,但我会从服务器得到消息。
try 
        {
            Toast.makeText(context,"IP: "+ip+" port: "+port,10000).show();
            InetAddress serverAddr = InetAddress.getByName(ip); 
            socket = new Socket(serverAddr, port);
        } 
        catch (UnknownHostException e1) 
        {
            Toast.makeText(context,"UnknownHostException ",10000).show();
        } 
        catch (IOException e1) 
        {
            Toast.makeText(context,"IOException ",10000).show();
        }

        String message = "HELLO FROM CLIENT";

        PrintWriter out = null;
        BufferedReader in = null;

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

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

            /*read - i modify to this*/
            InputStreamReader reader=new InputStreamReader(socket.getInputStream());
            char[] bytesreceived=new char[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 = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
            out.println("HELLO 2 FROM CLIENT");

            /*read*/
            reader=new InputStreamReader(socket.getInputStream());
            bytesreceived=new char[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();
            } 
        } 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace SocketServer
{
    class Program
    {
        static void Main(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 = new byte[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 = new byte[200];
            data2 = asen.GetBytes(welcome);
            int sentdata=client.Send(data2, data2.Length, SocketFlags.None);
            Console.WriteLine("Sent data from SERVER: {0}", welcome);



            byte[] data3 = new byte[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 = new byte[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();
        }
    }
}