Android和c#tcp通信

时间:2013-04-30 11:18:31

标签: c# android tcp

我想通过TCP从C#应用程序向Android模拟器或设备发送消息。我在Google上搜索过并获得了Android客户端和C#服务器的最大结果,但并不是我想要实现的目标。

这是我尝试过的;也许我会以错误的方式解决它,但我想要的是通过TCP向Android设备发送消息。

服务器代码发送消息:

    private static int port = 4444;
    private static TcpListener listener;
    private static Thread thread;
    private static int clientId = 0;

  listener = new TcpListener(new IPAddress(new byte[] { 127, 0, 0, 1 }), port);
        thread = new Thread(new ThreadStart(Listen));
        thread.Start();

private static void Listen()
    {
        listener.Start();
        MessageBox.Show("Listening on: " + port.ToString());

        while (true)
        {
            MessageBox.Show("Waiting for connection....");
            MessageBox.Show("Client No: " + clientId);
            TcpClient client = listener.AcceptTcpClient();
            Thread listenThread = new Thread(new ParameterizedThreadStart(ListenThread));
            listenThread.Start(client);
        }
    }

    private static void ListenThread(Object client)
    {

        NetworkStream netstream = ((TcpClient)client).GetStream();
        MessageBox.Show("Request made");
        clientId = clientId + 1;
        // String message = "Hello world";
        byte[] resMessage = Encoding.ASCII.GetBytes(clientId.ToString());
        netstream.Write(resMessage, 0, resMessage.Length);
        netstream.Close();
    }

客户代码

private TextView textDisplay;
Socket socket;
private static final int TCP_SERVER_PORT = 4444;
ServerSocket ss = null;
    try {
        ss = new ServerSocket(TCP_SERVER_PORT);
        //ss.setSoTimeout(10000);
        //accept connections
        Socket s = ss.accept();
        BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        //receive a message
        String incomingMsg = in.readLine() + System.getProperty("line.separator");
        Log.d("TcpServer", "received: " + incomingMsg);
        textDisplay.append("received: " + incomingMsg);
        //send a message
        String outgoingMsg = "goodbye from port " + TCP_SERVER_PORT + System.getProperty("line.separator");
        out.write(outgoingMsg);
        out.flush();
        Log.d("TcpServer", "sent: " + outgoingMsg);
        textDisplay.append("sent: " + outgoingMsg);
        //SystemClock.sleep(5000);
        s.close();
    } catch (InterruptedIOException e) {
        //if timeout occurs
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (ss != null) {
            try {
                ss.close();
            } catch (IOException e) {
                Log.d("Error",e.toString());
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

问题出在您的Client代码中。 在两个参与方之间打开了一个套接字,其中一个充当扮演bind->listen->accept的侦听器/服务器,另一个充当connect的客户端
您的代码中存在两个问题:

  1. 您的客户应connect而不是accept
  2. 您的客户端和服务器都将尝试从套接字读取并随后写入。如果您从套接字进行的读取和写入操作位于不同的线程上将没有问题,这将导致死锁。 如果您希望两个操作都在同一个线程上完成,那么您的客户端和服务器应该以相反的顺序执行读写操作:
    客户:read -> write
    服务器:write-> read