【问题标题】:I do not get messages from a server on my client我没有收到来自客户端服务器的消息
【发布时间】:2019-06-02 06:05:33
【问题描述】:

我正在尝试让我的服务器在 vb.net 上制作,以向我在 android 上制作的客户端发送消息。我有一个在 vb.net 上制作的客户端和服务器,我可以毫无问题地在它们之间发送和接收消息(文本)。但是当我尝试让客户端在 Android 上同样工作时,我无法接收到客户端(android)的消息,但是如果我可以让它向服务器(vb.net)发送消息.. 他们被困在这个,我不明白如何继续

服务器 VB.NET



Imports System.Net.Sockets
Imports System.Text

Public Class Servidor
    Dim Tcp As TcpListener
    Dim th As New Threading.Thread(AddressOf Rutina)
    Dim ejecuto = False
    Private Sub Servidor_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        CheckForIllegalCrossThreadCalls = False
    End Sub
    Dim tcpservercliente As New TcpClient
    Public Function Rutina()
        Try
            Do
                If ejecuto = True Then
                    Exit Do
                End If
                If Tcp.Pending = True Then
                    tcpservercliente.Client = Tcp.AcceptSocket
                End If
                If tcpservercliente.Available > 0 Then
                    Dim databytes(1000) As Byte
                    Dim decode As New ASCIIEncoding
                    tcpservercliente.Client.Receive(databytes)
                    txtRecibido.Text += vbCrLf & "Cliente Android: " & decode.GetString(databytes)
                End If

            Loop
        Catch ex As System.InvalidOperationException
            MsgBox("Error: " & ex.Message)
        End Try




    End Function
    Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
        Try
            Tcp = New TcpListener(System.Net.IPAddress.Parse("192.168.1.8"), 1371)
            Tcp.Start()
            th.Start()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

    End Sub

    Private Sub Servidor_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
        th.Abort("Rutina")
        Application.Exit()
    End Sub

    Private Sub btnEnviar_Click(sender As Object, e As EventArgs) Handles btnEnviar.Click
        Try
            Dim decode As New ASCIIEncoding
            tcpservercliente.Client.Send(decode.GetBytes(txtMensajeEnviar.Text))
        Catch ex As System.Net.Sockets.SocketException
            MsgBox(ex.Message)
        End Try

    End Sub


安卓客户端


//CLASS RM 

public class RM extends AsyncTask<Void, Void, Void> {
    Socket socket;
    BufferedReader input;

    @Override
    protected Void doInBackground(Void... voids) {
        try {
            socket = new Socket("192.168.1.8",1371);
            InputStreamReader streamReader = new InputStreamReader(socket.getInputStream());
            input = new BufferedReader(streamReader);
            if(input.ready()){
                Log.i("AsyncTask", "Ready ");
            }else{
                Log.i("AsyncTask", "No Ready");
            }
            input.close();
            socket.close();
        }catch (IOException e){
            e.printStackTrace();
        }

        return null;
    }
}



//VOID MAIN ACTIVITY

RM mr = new RM();
        mr.execute();

我试图看到它返回的时间,它总是空的。从服务器发送的消息没有到达

对不起,我的英语不好

============================================

编辑: 这是我用来从客户端(android)向服务器(vb.net)发送消息的类

package com.example.app_test_client;

import android.os.AsyncTask;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
public class MessageSender extends AsyncTask<String, Void, Void> {

    Socket socket;
    PrintWriter pw;
    @Override
    protected Void doInBackground(String... voids) {
        String mensaje_enviar = voids[0];
        try {
            socket = new Socket("192.168.1.8",1371);
            pw = new PrintWriter(socket.getOutputStream());
            pw.write(mensaje_enviar);
            pw.flush();
            pw.close();
            socket.close();
        }catch (IOException e){
            e.printStackTrace();
        }
        return null;
    }
}

代码主要活动(客户端 ANDROID)

package com.example.app_test_client;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity{
    EditText mensaje_enviar;
    TextView mensaje_recibido;


    @Override

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mensaje_enviar = (EditText)findViewById(R.id.txtTexto);
        mensaje_recibido = (TextView)findViewById(R.id.lblMensaje);
    }

    public void enviar(View v){
        MessageSender MensajeRemitente = new MessageSender();
        MensajeRemitente.execute(mensaje_enviar.getText().toString());
    }
}

无效的“enviar”我在“onClick”按钮中有它。从客户端(android)向服务器(vb.net)发送消息的所有这些都对我有用。

基于“MessageSender”这个类,我做了另一个等于在客户端(android)上接收消息但它没有工作

【问题讨论】:

    标签: java android vb.net sockets


    【解决方案1】:

    如果您尝试在 Android 设备中接收消息,那么您将错过使用String messageReceived = input.readLine(); 阅读消息本身。您的代码如下所示:

    ...
    socket = new Socket("192.168.1.8",1371);
    InputStreamReader streamReader = new InputStreamReader(socket.getInputStream());
    input = new BufferedReader(streamReader);
    String messageReceived = input.readLine();
    ...
    

    您将收到来自messageReceived 的服务器发送的消息。

    编辑

    无需详细说明,当您读取从服务器发送的数据时,您需要知道发送的数据何时“结束”,而当前实现的最简单方法是打印“行结束”( VB 中的vbCrLf 字符)发送消息时。因此,在您的 Sub btnEnviar_Click 中,您需要添加一个 vbCrLf,如下所示:

    tcpservercliente.Client.Send(decode.GetBytes(txtMensajeEnviar.Text & vbCrLf))
    

    补充说明

    1. 从服务器读取数据时,套接字需要知道数据何时结束。有几种方法可以实现这一点,但在您的情况下,最简单的方法是使用String messageReceived = br.readLine(); 阅读“行尾”。如果服务器没有发送任何“行结束”(如在您当前的实现中),它将继续等待它,因此看起来程序挂起。当您注意到您在阅读消息后无法做任何其他事情时,您的情况就是这样 - 它只是在等待永远不会到来的事情。
    2. 从服务器读取时不必检查input.ready()。只有当数据已经从服务器完全发送出去时才会出现这种情况,并且很有可能在调用时数据仍在发送中。
    3. 如果您想更好地了解 TCP 套接字的工作原理,this SO question 有很好的示例供您尝试。

    【讨论】:

    • 它没有返回任何值给我,似乎更多的是到达“input.readLine()”行时发生了一些错误。因为我放了一个“日志”来查看它是否可以很好地到达该行:“socket = new Socket("192.168.1.8",1371); InputStreamReader streamReader = new InputStreamReader(socket.getInputStream()); Log.i(" Tst", "1"); input = new BufferedReader(streamReader); Log.i("Tst", "2"); messageReceived = input.readLine(); Log.i("Tst", "3");输入.close(); socket.close();"但从未达到“3”。该程序不再允许我在执行该代码后发送消息。 i.imgur.com/WUz7uB5.png
    • 我明白了。 1)当您说“执行该代码后程序不再允许我发送消息”时,您指的是使用btnEnviar_Click从服务器发送消息? 2) 是否可以修改服务器代码?
    • 1.我的意思是,在客户端(android)中,我可以毫无问题地向服务器(vb.net)发送消息,但是如果我运行代码从客户端(android)读取消息,则应用程序不再工作(它不会关闭或什么),然后他不让我发送消息(好像执行时接收消息的问题,会影响整个应用程序)。 2.是的,我可以修改服务器
    • 如果我没有正确解释自己,我会再次解释。我有一个在 vb.net 上制作的客户端,我可以在其中从 vb.net 上的服务器发送和接收消息(我在上面发布的那个)。我在 android 上创建了一个客户端,我可以在其中向服务器发送消息,但我无法从服务器(vb.net)接收消息。问题是某些代码无法接收消息(android)。例如,我可以毫无问题地从客户端(android)向服务器(vb.net)发送几条消息,但是如果我执行代码来接收消息在客户端(之前从我的服务器发送消息)
    • ..然后发生故障(它没有显示任何错误或任何东西)并影响整个程序,导致它现在无法从客户端(android)发送消息..这使得我认为执行代码时出现问题,这完全影响了程序。我不知道它可能是什么。我看过几个教程和指南,它们总是使用相同的方式。我执行“doInBackground”会出错吗?谢谢
    猜你喜欢
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多