服务器无法在C++;服务器和Android(Java)客户端

服务器无法在C++;服务器和Android(Java)客户端,java,android,c++,tcp,client-server,Java,Android,C++,Tcp,Client Server,我正在尝试在桌面程序(C/C++,目前仅限命令行)和Android设备之间构建一个客户机/服务器模型,稍后将用于发送数据对象 我是客户机/服务器编程的新手。作为一个开始,我设法建立了一个简单聊天的工作连接,但是有一些bug我很难理解。客户端只能发送一次消息,服务器根本无法响应 你有什么想法吗?也许是缓冲区?还是连接本身?我花了好几个小时试着去理解,但我想不出来。 以下是代码(仅适用于相关部分): 服务器: int main (int argc, char *argv[]) { int

我正在尝试在桌面程序(C/C++,目前仅限命令行)和Android设备之间构建一个客户机/服务器模型,稍后将用于发送数据对象

我是客户机/服务器编程的新手。作为一个开始,我设法建立了一个简单聊天的工作连接,但是有一些bug我很难理解。客户端只能发送一次消息,服务器根本无法响应

你有什么想法吗?也许是缓冲区?还是连接本身?我花了好几个小时试着去理解,但我想不出来。 以下是代码(仅适用于相关部分):

服务器:

int main (int argc, char *argv[]) {

    int sockfd, newsockfd;
    int pid;
    int portno;
    socklen_t clilen;
    int n;
    int portNum = 1500;
    char buffer[2048];
    struct sockaddr_in serv_addr, cli_addr;

    struct sockaddr_in {
      short   sin_family; /* must be AF_INET */
      u_short sin_port;Server: 
      struct  in_addr sin_addr;
      char    sin_zero[8]; /* Not used, must be zero */
    };

    if (argc < 2) {
       fprintf(stderr,"Server: ERROR, no port provided");
       exit(1);
    }

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if (sockfd < 0) {
          error("Server: ERROR opening socket");
        }

    bzero((char *) &serv_addr, sizeof(serv_addr));

    portno = atoi(argv[1]);

    serv_addr.sin_family = AF_INET;

    serv_addr.sin_port = htons(portno);

    serv_addr.sin_addr.s_addr = INADDR_ANY;

    if(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
        error ("Server: Error on binding");
    }

    if (listen(sockfd, 1) != 0) {
        perror("listen");
        exit(EXIT_FAILURE);
    }

    clilen = sizeof(cli_addr);

    while (1) {

        newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
        if (newsockfd < 0) error("ERROR on accept");

        bzero(buffer, 2048);

        n = read(newsockfd, buffer, 2047);
        if (n < 0) error("ERROR in reading");

        printf("Here is the message: %s\n",buffer);

        n = write(newsockfd,"I got your message", 18);

        if (n < 0) error("ERROR in writing");

     }
     return 0;
    }

你为什么要自己在结构中重新定义
sockaddr\u?为什么不使用系统头文件中的标准定义?至于你的问题,你的Android程序要求读取行,但C程序不发送任何行。将
“\r\n”
添加到您编写的字符串末尾(并将其包含在课程长度中)。
public class AndroidClientActivity extends AppCompatActivity {

  private static final String hostname = "127.0.0.1";
  private static final int portnumber = 1500;
  private static final String debugString = "debug: ";
  Socket socket = null;

  private EditText textField;
  private Button sendButton;
  private String message = "";

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.android_client_activity);

    textField = (EditText) findViewById(R.id.edit);
    sendButton = (Button) findViewById(R.id.send_msg);

    new Thread() {
      @Override
      public void run() {
        Log.i(debugString, "Running");
          //Connecting
          Log.i(debugString, "Trying to connect...");

          //connect
          try {
            socket = new Socket(hostname, portnumber);
            Log.i(debugString, "Connected");
          } catch (IOException e) {
            e.printStackTrace();
            Log.e(debugString, e.getMessage());
          }

          //Send message to server
          sendButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
              message = textField.getText().toString();

              textField.setText("");
              Log.i(debugString, "On click detected");
                //send and get msg to server
              try {
                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                bw.write("This is a message from the client: " + message);
                bw.newLine();
                bw.flush();
                Log.i(debugString, "Client: Message sent.");

              } catch (IOException e) {
                e.printStackTrace();
                Log.e(debugString, e.getMessage());
              }
            }
          });
        try {
          //Get message from the server
          BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); //get the content from the socket's input stream
          String msg = br.readLine();
          System.out.println("Server: " + msg);
          Log.i(debugString, "Client: message received from server." + msg);

        } catch (IOException e) {
          e.printStackTrace();
          Log.e(debugString, e.getMessage());
        }
        }
    }.start();

  }
}