我正在尝试让我的服务器在 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))
附加说明
- 当从服务器读取数据时,套接字需要知道数据何时结束。有多种方法可以实现此目的,但最简单的方法是在您的情况下使用
String messageReceived = br.readLine();
读取“行结尾”。如果服务器不发送任何“行结束”(如您当前的实现中),它将继续等待它,因此看起来程序挂起。这就是您的情况,当您注意到在阅读该消息后您无法执行任何其他操作时,您只是在等待永远不会到来的事情。 - 从服务器读取数据时,无需检查
input.ready()
。只有当数据已经从服务器完全发送出去时才会出现这种情况,并且调用时很有可能数据仍在发送。 - 如果您想更好地了解 TCP 套接字的工作原理,this SO question有很好的例子,您可以尝试。
关于java - 我在客户端上没有收到来自服务器的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56412585/