我有一个Android Studio应用程序,用于客户端读取加速计的数据,并将其发送到运行TCP C套接字服务器的计算机。
我想等到服务器确认接收到数据后再发送一个。当我不得不从Android系统读取服务器的确认信息时,问题就出现了,这只是简单的崩溃,我不知道为什么。这是我使用的代码。
服务器代码
#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
#define PORT 8080
int main(int argc, char const *argv[])
{
int server_fd, new_socket, valread;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[1024] = {0};
const char *ACK = "ACTUATE";
std::string data;
socklen_t len;
char *error;
// Creating socket file descriptor
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0)
{
perror("socket failed");
exit(EXIT_FAILURE);
}
// Forcefully attaching socket to the port 8080
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT,
&opt, sizeof(opt)))
{
perror("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons( PORT );
// Forcefully attaching socket to the port 8080
if (bind(server_fd, (struct sockaddr *)&address,
sizeof(address))<0)
{
perror("bind failed");
exit(EXIT_FAILURE);
}
if (listen(server_fd, 3) < 0)
{
perror("listen");
exit(EXIT_FAILURE);
}
if ((new_socket = accept(server_fd, (struct sockaddr *)&address,
(socklen_t*)&addrlen))<0)
{
perror("accept");
exit(EXIT_FAILURE);
}
//int retval = getsockopt (new_socket, SOL_SOCKET, SO_ERROR, &error, &len);
while(true){
valread = read( new_socket , buffer, 1024);
for(int i = 0;i < 1024 ; i++){
if(buffer[i]!=0){
data = data + buffer[i];
}
buffer[i]=0;
}
data.clear();
std::cout<<"Sended ACK"<<std::endl;
send(new_socket , ACK , strlen(ACK) , 0 );
}
return 0;
}
和客户端代码(Android Studio)
public class MainActivity extends AppCompatActivity implements SensorEventListener {
EditText IP_entrada;
TextView textView;
TextView OutputText;
SensorManager sensorManager;
Sensor sensor;
String datos;
String Salida = "CONSOLE OUTPUT";
boolean Cerrar;
boolean Conectado;
Socket sk;
PrintWriter TCPOutput;
BufferedReader TCPInput;
String ACK;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IP_entrada = findViewById(R.id.IP_text);
textView = findViewById(R.id.text_accelerometer);
OutputText = findViewById(R.id.Output);
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(MainActivity.this,sensor, SensorManager.SENSOR_DELAY_FASTEST);
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitNetwork().build());
Cerrar = false;
Conectado = false;
}
private void Send(String _DATA) {
TCPOutput.println(_DATA);
}
private void Read(){
try {
ACK = TCPInput.readLine();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
OutputText.setText(Salida);
datos = sensorEvent.values[0]+","+sensorEvent.values[1]+","+sensorEvent.values[2];
textView.setText(datos);
if(Conectado){
Send(datos);
while(!ACK.equals("ACTUATE")) {
Read();
}
}
if(Cerrar){
try {
sk.close();
} catch (IOException e) {
e.printStackTrace();
}
Conectado = false;
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
public void SetDirection(View view) {
log("Modo Conectar = true");
try {
log(" Socket: " + IP_entrada.getText().toString() + ":" + 8080);
sk = new Socket(IP_entrada.getText().toString(), 8080);
log("Conectado a IP:"+IP_entrada.getText().toString());
TCPOutput = new PrintWriter(new OutputStreamWriter(sk.getOutputStream()), true);
log("Conectado con exito");
TCPInput = new BufferedReader(new InputStreamReader(sk.getInputStream()));
Conectado = true;
} catch (IOException e) {
e.printStackTrace();
}
} //Conectar
public void DisconnectClient(View view){
log("Modo Cerrar = true");
Cerrar = true;
} //Desconectar
private void log(String string) {
OutputText.setText(String.format("%s\n", string));
}
}
我在交流中遗漏了什么还是我做错了什么?
[服务器]:
我正在使用TCP / IP流编写客户端服务器Java程序,我的服务器连接到oracle数据库。当客户端请求一些信息时,服务器处理查询,即返回一个包含一些行的列(例如 5)。我想将整列发送回客户端,我能够发送和接收单行数据,但不能发送和接收多行(因为表包含许多行 i,e 行)....任何帮助都是可取的
创建 TCP 客户端 最简单的方法来创建一个 TCP 客户端,使用默认选项如下所示: NetClient client = vertx.createNetClient(); 配置 TCP 客户端 如果你不想使用默认值,则创建TCP 客户端时,通过传入NetClientOptions实例可以配置: NetClientOptions options = new NetClientOptions().s
问题内容: 我正在使用apache http客户端来测试我的WS。我已经在球衣上写了一个WS。该WS的URL是 用URL调用这个WS我写了一个方法如下 现在,当我运行程序并将URL传递给此函数时,我在行中得到了异常 异常如下 现在,如果我使用WS网址并使用任何浏览器访问它,我都会得到预期的结果,但我想知道我的Apache HTTP客户端代码出了什么问题。 问题答案: 我从这里浏览了链接,并得到以下
问题内容: 我正在尝试编写一个简单的Java http客户端,该客户端仅打印出服务器响应的一行。我的问题是服务器没有响应。这是我所拥有的,正在编译并且没有明显错误地运行,只是在键入主机名(例如“ www.google.com”)后挂起: 有什么建议?请注意,这假设存在一个“ index.html”-即使为true,它仍会挂起。 问题答案: 我认为我可以通过对代码进行少量更改来重现该问题,因此现在它
创建 TCP 服务器 使用最简单的方法来创建一个 TCP 服务器,使用所有默认选项如下所示: NetServer server = vertx.createNetServer(); 配置 TCP 服务器 如果你不想默认值,可以将服务器配置通过传入一个NetServerOptions实例来创建它: NetServerOptions options = new NetServerOptions().s