Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.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# Android套接字与服务器的连接_C#_Android_Sockets - Fatal编程技术网

C# Android套接字与服务器的连接

C# Android套接字与服务器的连接,c#,android,sockets,C#,Android,Sockets,我正在尝试将我的Android手机连接到服务器。在服务器上运行一个用C#编写的程序。我试着用下面的代码实现它,但它不起作用。 这是Android代码 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Socket socket; int p

我正在尝试将我的Android手机连接到服务器。在服务器上运行一个用C#编写的程序。我试着用下面的代码实现它,但它不起作用。 这是Android代码

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Socket socket;
    int port = 52301;
    String ip = "79.16.115.30";
    Button b = (Button) findViewById(R.id.myButton);
    assert b != null;
    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                byte[] b = ip.getBytes();
                /*SocketAddress socketAddress = new InetSocketAddress(ip, port);

                socket.connect(socketAddress);*/
                socket = new Socket(ip, port);
                Toast.makeText(v.getContext(), "CONNESSO", Toast.LENGTH_SHORT).show();
            } catch (UnknownHostException e) {
                Toast.makeText(v.getContext(), "CHI MINCHIA è COSTUI", Toast.LENGTH_SHORT).show();
            }catch(IOException e) {
                Toast.makeText(v.getContext(), "NO I/O", Toast.LENGTH_SHORT).show();
            }
            catch (Exception e)
            {
                String cause = "Message: " + e.getMessage();
                Toast.makeText(v.getContext(), cause, Toast.LENGTH_SHORT).show();
            }
        }
    });
}
我也尝试过使用注释过的代码,但它不起作用

这是在服务器上运行的程序:

static void Main(string[] args)
    {
        string ip = Get_external_ip();
        int port = 52301;
        int max = 10;
        IPAddress ipAddress = IPAddress.Parse("192.168.1.56");
        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, port);                                         //setto i parametri del socket
        Socket sockServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);    //creo il socket
        Socket client;

        Console.WriteLine(ip);
        try
        {
            sockServer.Bind(localEndPoint);
            sockServer.Listen(max);
            while (true)
            {
                client = sockServer.Accept();
                Console.WriteLine(client.RemoteEndPoint.ToString());
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }

        Console.ReadLine();
    }

    private static string Get_external_ip()
    {
        try
        {
            WebClient client = new WebClient();
            return client.DownloadString("http://icanhazip.com/").TrimEnd('\r', '\n');
        }
        catch (Exception e)
        {
            return e.Message;
        }
    }

首先,为网络使用后台线程

我会给你我的工作片段。试着用它来满足你的需要

public class YourClass {
//Server socket variables
private ServerSocket serverSocket;
private DataOutputStream dataOutputStream;
private DataInputStream dataInputStream;
private Socket client;
....

 private class SocketServerThread extends Thread {

    private int port;

    private SocketServerThread(int port) {
        this.port = port; 
    }

    @Override
    public void run() {
        dataInputStream = null;
        dataOutputStream = null;

        try {
            serverSocket = new ServerSocket(port);
            isSockedOpened = true;

            client = serverSocket.accept(); //wait for client
            isClientConnected = true;

            Log.d(TAG, "Client connected: " + client.getInetAddress().getHostAddress());

            dataInputStream = new DataInputStream(
                    client.getInputStream());

            dataOutputStream = new DataOutputStream(
                    client.getOutputStream());

            String messageFromClient;
            while (isClientConnected) {

                messageFromClient = dataInputStream.readLine();

                handleIncomingMessage(messageFromClient);
             }
            }
        } catch (IOException e) {
            Log.e(TAG, e.getMessage());

        } catch (NullPointerException e) {
            Log.e(TAG, e.getMessage());
        }
    }
}
要打开连接,请执行以下操作:

public void connect(int port) {
    this.port = port;

    Thread socketServerThread = new Thread(new SocketServerThread(port));
    socketServerThread.start();
}    
这就是检查客户端是否连接的方式

public boolean isConnected() {
    return serverSocket.isBound() || client.isConnected();
}
要断开连接:

public void disconnect(boolean needsGathering) {
    if (isSockedOpened) {
        try {
            if (serverSocket != null) {
                serverSocket.close(); 
            }

            if (dataOutputStream != null) {
                dataOutputStream.close();
            }

            if (dataInputStream != null) {
                dataInputStream.close();
            }

            if (client != null) {
                client.close();
            }

        } catch (IOException e) {
            Log.e(TAG, "Couldn't get I/O for the connection");
            Log.e(TAG, e.getMessage());
        }
    } else {
        Log.d(TAG, "Socket was not opened");
    }
}
}