当前位置: 首页 > 知识库问答 >
问题:

TCP/IP无法响应服务器到客户端。C/Java

江渊
2023-03-14

我有一个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));
    }
}

我在交流中遗漏了什么还是我做错了什么?

共有1个答案

窦夜洛
2023-03-14

Thx user253751,解决方案是在服务器确认字中添加\n,如下所示

const char*ACK=“启动\n”

 类似资料:
  • 我正在使用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