非更新套接字消息
Non-updating socket message
我一直在研究我的Raspberry Pi和手机之间的连接,为了实现它,我想使用插座。 凭借我最少的经验,我在互联网上嗅了嗅,试图为我的Pi(C++(找到套接字代码,为我的手机(Java(找到Android应用程序。两者都包括在下面。
我遇到的问题是,当从C++服务器发送新消息时,手机上的文本框不会更新。我相信我用C++写的代码很好。它所要做的就是不断要求用户提供新的输入以发送给客户端。
我相信问题是在我手机的Java应用程序中。
我完全不知道我在做什么,我希望这里有人可以用简单的术语解释我正在发生的事情(或者更确切地说是没有发生的事情(。
提前谢谢你!
C++服务器代码:
#include <iostream>
#include <boost/asio.hpp>
using namespace boost::asio;
using ip::tcp;
using std::string;
using std::cout;
using std::endl;
string read_(tcp::socket & socket)
{
boost::asio::streambuf buf;
boost::asio::read_until(socket, buf, "n" );
string data = boost::asio::buffer_cast<const char*>(buf.data());
return data;
}
void send_(tcp::socket & socket, const string& message)
{
const string msg = message + "n";
boost::asio::write(socket, boost::asio::buffer(message));
}
int main()
{
boost::asio::io_service io_service;
tcp::acceptor acceptor_(io_service, tcp::endpoint(tcp::v4(), 41517));
tcp::socket socket_(io_service);
acceptor_.accept(socket_);
/*
string message = read_(socket_);
cout << message << endl;
*/
send_(socket_, "Hello from server!n");
cout << "Server sent hello message to Client!" << endl;
char message[400];
while(true)
{
std::cin.getline(message, 400);
string messageStr = message;
if(messageStr.length() > 0)
{
send_(socket_, messageStr);
cout << "The following message has been sent:" << endl << endl;
cout << messageStr << endl << endl << "-----------------------------" << endl << endl;
}
else
{
cout << "No message has been sent." << endl << endl << "-----------------------------" << endl << endl;
}
}
return 0;
}
Java 客户端代码
package com.example.socket_test2;
import androidx.appcompat.app.AppCompatActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.SocketAddress;
import static java.lang.Integer.parseInt;
public class MainActivity extends AppCompatActivity {
TextView responseField;
EditText ipField, portField;
Button randomButton;
ConnectionMaker juin = new ConnectionMaker();
Socket sock = new Socket();
BufferedReader br;
private class ConnectionMaker extends AsyncTask<String, Integer, Integer> {
@Override
protected Integer doInBackground(String... strings) {
try {
SocketAddress addr = new InetSocketAddress(strings[0], parseInt(strings[1]));
sock.connect(addr);
br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
while(true) {
responseField.setText(br.readLine());
}
//sock.close();
} catch (Exception ex) {
responseField.setText(ex.getLocalizedMessage());
}
return 1;
}
}
View.OnClickListener action = new View.OnClickListener() {
@Override
public void onClick(View v) {
try{
juin.execute(ipField.getText().toString(), portField.getText().toString());
} catch (Exception ex) {
responseField.setText(ex.getLocalizedMessage());
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
responseField = findViewById(R.id.ResponseField);
randomButton = findViewById(R.id.RandomButton);
ipField = findViewById(R.id.IP_Field);
portField = findViewById(R.id.Port_Field);
randomButton.setOnClickListener(action);
}
}
AsyncTask
的doInBackground
方法不在 UI 线程上运行,因此不允许在那里调用responseField.setText
。或者更确切地说:你可以调用它,但不能保证它被 UI 线程看到。
请改用publishProgress
,其onProgressUpdate
处理程序在 UI 线程上调用:
private class ConnectionMaker extends AsyncTask<String, String, Integer> {
@Override
protected Integer doInBackground(String... strings) {
try {
SocketAddress addr = new InetSocketAddress(strings[0], parseInt(strings[1]));
sock.connect(addr);
br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
while(true) {
publishProgress(br.readLine());
}
//sock.close();
} catch (Exception ex) {
responseField.setText(ex.getLocalizedMessage());
}
return 1;
}
@Override
protected void onProgressUpdate(String... progress) {
responseField.setText(progres[0]);
}
}
相关文章:
- 非更新套接字消息
- 如何在C++中创建特定大小的消息以通过UDP套接字发送?
- 发送和十六进制消息时套接字代码C++问题
- 如何使用阻止套接字 API 添加消息发送操作 (smtp) 的进度?
- 当我使用套接字代码发送第二条消息时,我有一个"sendto() Invalid argument"
- 多线程套接字编程服务器仅从 1 个客户端线程获取消息
- C# UDP 套接字无法接收消息
- 套接字记录未读取任何消息
- 通过套接字C++从设备接收消息
- Datagram套接字服务器未从客户端接收消息
- C/C++ 中的套接字编程 - 接收由 typedef 结构定义的消息
- 如何正确读取套接字消息(C++)
- 套接字消息头构建
- 套接字Java到C++-消息的长度总是8192个字符
- 如何使用套接字实现服务器客户端编程,在套接字中服务器向客户端发送消息而不从客户端获取请求
- C++中的多线程,从套接字接收消息
- C++套接字接收混合消息
- C++套接字客户端/服务器简单消息发送器
- 如何在套接字编程中发送长度大于缓冲区的消息
- 套接字编程中的客户端到客户端消息传递