java - 我在客户端上没有收到来自服务器的消息

标签 java android vb.net sockets

我正在尝试让我的服务器在 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;
    }
}

主要 Activity 代码(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)上接收消息的类,但它没有工作

最佳答案

如果您尝试在 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有很好的例子,您可以尝试。

关于java - 我在客户端上没有收到来自服务器的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56412585/

相关文章:

java - 无法将 '' 下的属性绑定(bind)到 com.zaxxer.hikari

android - 如何开发跨平台移动应用程序

asp.net - iOS:如何将凭据添加到 NSURL 的代码中?

java - 在 Spark Java 中正确输出矩阵

Java SAX 读取带有元字符的文件名

Java Socket 服务器客户端代码卡住

android - 模拟器不能在 Xubuntu 12.04 上运行

mysql - 如何使用文本框值作为 SQL 连接字符串

c# - 如何打开带附件的默认电子邮件客户端

java - JPA 2.0 JPQL 更新