tcp 소켓을 통해 Java 서버에서 Android 클라이언트로 메시지 반환

블라드

매우 간단한 클라이언트 / 서버 연결을 시도하고 있습니다. 클라이언트로 Android 앱이 있으며

1) PC의 Java 프로그램에 메시지 전달 후

2) 안드로이드 클라이언트에 메시지를 반환합니다.

첫 번째 부분은 잘 작동합니다. 문제는 서버에서 클라이언트로 메시지를 반환하는 것입니다.

서버 코드 (Java) :

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;


public class Main {

    private final static Integer IN_PORT = 4444; 

    private static ServerSocket serverSocket = null;
    private static Socket sktIn;
    private static InputStreamReader inputStreamReader;
    private static BufferedReader bufferedReader;
    private static String message;

    private static PrintWriter printWriter;

    public static void main(String[] args) {

        try {
            serverSocket = new ServerSocket(IN_PORT);  //Server socket
            System.out.println("Server started. Listening to the port " + IN_PORT);        
        } catch (IOException e) {
            System.out.println("Could not listen on port: " + IN_PORT);
        }


        while (true) {
         try {
          sktIn = serverSocket.accept();   //accept the client connection
                inputStreamReader = new InputStreamReader(sktIn.getInputStream());
                bufferedReader = new BufferedReader(inputStreamReader); //get the client message
                message = bufferedReader.readLine();

                printWriter = new PrintWriter(sktIn.getOutputStream(), true);
                printWriter.write("Returned back \n");  //write the message to output stream
                printWriter.flush();
                printWriter.close();             
                inputStreamReader.close();               
                sktIn.close();

                System.out.println(message);                               

            } catch (IOException ex) {
                System.out.println("Problem in message reading/sending.");
                ex.printStackTrace();
            }

        }

    }
}

클라이언트 주요 활동 (Android) :

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class SimpleClientActivity extends Activity {

    private final Integer OUT_PORT = 4444;
    private final String S_IP = "192.168.1.104"; 

    private EditText textField;
    private Button button;
    private String message;


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

        textField = (EditText) findViewById(R.id.editText1); //reference to the text field
        button = (Button) findViewById(R.id.button1);   //reference to the send button

        //Button press event listener
        button.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                message = textField.getText().toString(); //get the text message on the text field
                textField.setText("");      //Reset the text field to blank

                new ConnectClient(message, S_IP, OUT_PORT, getApplicationContext()).execute(); 
            }
         });
    }
}

연결을위한 별도의 AsyncTask 클래스 :

import android.content.Context;
import android.os.AsyncTask;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class ConnectClient extends AsyncTask<String, Void, String> {

    private Socket socket;
    private PrintWriter printWriter;

    private String param;   
    private Context context;
    private Integer PORT;
    private String IP;

    private static InputStreamReader inputStreamReader;
    private static BufferedReader bufferedReader;
    private static String message;


 public ConnectClient(String par, String ip, Integer prt, Context ctx){
  super();
     this.context = ctx;
     this.param = par;
     this.PORT = prt;
     this.IP = ip;
 }

 @Override
    public void onPreExecute() {
        Toast.makeText(context, "start " + param, Toast.LENGTH_SHORT)
           .show();
    }

 @Override
    protected String doInBackground(String... params) {

        try {
                socket = new Socket(IP, PORT);  //connect to server

                printWriter = new PrintWriter(socket.getOutputStream(), true);
                printWriter.write(param);  //write the message to output stream

                printWriter.flush();
                printWriter.close();

                socket = new Socket(IP, PORT); // second connection to server     
                inputStreamReader = new InputStreamReader(socket.getInputStream());
                message = "after isr";
                bufferedReader = new BufferedReader(inputStreamReader); //get the client message
                message = bufferedReader.readLine();
                inputStreamReader.close();          
                socket.close();   //closing the connection

            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        return message;
    }

    @Override
    protected void onPostExecute(String result) {
        Toast.makeText(context, result, Toast.LENGTH_SHORT).show()   
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        Toast.makeText(context, "In progress", Toast.LENGTH_SHORT).show();
    }
}

자바 프로그램은 정상적으로 실행되고 Android 앱은 문제없이 실행되지만 최종 결과는 원하는대로되지 않습니다.

두 번째를 제거하면 socket = new Socket(IP, PORT); // second connection to server서버가 메시지를 정상적으로 수신합니다. 자바 콘솔에서 나는 앱에 넣은 모든 것을 인쇄하고 보냅니다. 그러나 두 번째 Toast는 비어 있습니다 (서버의 메시지가 전달되지 않음). 그리고 LogCat에서 SocketException (닫힘)이 발생합니다.

01-29 06:38:36.039: W/System.err(11547): java.net.SocketException: Socket is closed
01-29 06:38:36.059: W/System.err(11547):  at java.net.PlainSocketImpl.checkNotClosed(PlainSocketImpl.java:134)
01-29 06:38:36.059: W/System.err(11547):  at java.net.PlainSocketImpl.getInputStream(PlainSocketImpl.java:216)
01-29 06:38:36.059: W/System.err(11547):  at java.net.Socket.getInputStream(Socket.java:343)
01-29 06:38:36.059: W/System.err(11547):  at com.example.simpleclient.ConnectClient.doInBackground(ConnectClient.java:63)
01-29 06:38:36.059: W/System.err(11547):  at com.example.simpleclient.ConnectClient.doInBackground(ConnectClient.java:1)
01-29 06:38:36.059: W/System.err(11547):  at android.os.AsyncTask$2.call(AsyncTask.java:287)
01-29 06:38:36.059: W/System.err(11547):  at java.util.concurrent.FutureTask.run(FutureTask.java:234)
01-29 06:38:36.059: W/System.err(11547):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
01-29 06:38:36.059: W/System.err(11547):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
01-29 06:38:36.059: W/System.err(11547):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
01-29 06:38:36.059: W/System.err(11547):  at java.lang.Thread.run(Thread.java:841)

socket = new Socket(IP, PORT); // second connection to server코드 줄을 남겨두면 오류 메시지는 없지만 메시지는 서버에 한 번만 전달됩니다. 2nd, 3rd, end 등은 통과하지 않습니다 (콘솔에 아무것도 표시되지 않음). 콘솔을 실행하고 앱을 종료하면 또 다른 null이 발생합니다.

어쨌든 두 번째 Toast (클라이언트 측)는 비어 있거나 (서버의 메시지가 전달되지 않음) 전혀 표시되지 않습니다 ( message = bufferedReader.readLine();추가 실행 차단). 예를 들어, 줄을 주석 처리 message = bufferedReader.readLine();하면 두 번째 Toast에서 "after isr"이 표시됩니다. 또는 socket = new Socket(IP, PORT); // second connection두 번째 토스트가있는 경우 두 번째 토스트가 전혀 표시되지 않습니다.

나는 무엇을 놓치고있다. 서버에서 클라이언트로 메시지를 어떻게 보내나요?

마우로 데 팔마

클라이언트와 서버의 명령은 대칭이어야합니다.

클라이언트가 쓰는 경우 서버는 읽어야하며 그 반대의 경우도 마찬가지입니다.

클라이언트가 inputStream을 열면 서버는 outputStream을 열어야합니다.

이제 첫 번째 연결에서는 outputStream 만 열지 만 서버에는 둘 다 있습니다.

또한 서버에서 하나로 처리되는 두 개의 연결 (클라이언트)을 열면 서버에 읽기 작업이 있기 때문에 첫 번째 인쇄 작업은 제대로 작동하지만 서버에서 할 수없는 다른 연결을 생성하기 때문에 다른 연결은 작동하지 않습니다. 처리 이유 :

1) 서버가 다중 스레드가 아닙니다.

2) 서버는 첫 번째 연결에서 작동해야합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Swift 클라이언트에서 Java 서버로 소켓 출력 스트림을 통해 메시지 보내기

소켓을 통해 Java 클라이언트에서 c 서버로 int 쓰기

TCP Android 서버가 Java TCP 클라이언트에서 첫 번째 메시지를받지 못함

소켓을 사용하여 Java 클라이언트에서 Python 서버로 또는 그 반대로 메시지 보내기

소켓을 통해 Java 클라이언트에서 NodeJS 서버로 문자열을 전송하면 원하지 않는 문자도 전송됩니다.

스프링 통합 및 TCP 서버 소켓-클라이언트에게 메시지를 보내려면 어떻게해야합니까?

TCP 소켓을 통해 ObjectInputStream, Java 및 Lua 클라이언트와 네트워킹

파이썬에서 TCP 소켓을 통해 클라이언트-서버 간 파일 보내기?

서버가 C의 소켓을 통해 클라이언트에 메시지를 보낼 수 없습니다.

Java의 소켓을 통해 클라이언트에서 서버로 파일 전송

소켓 연결을 통해 클라이언트에서 서버로 이미지 보내기

TCP를 통해 안드로이드 (소켓 클라이언트)를 C ++ (소켓 서버)와 연결

C # UWP는 소켓을 통해 TCP 클라이언트에 연결

TCP 소켓 서버 클라이언트 연결 fd로 인해 메모리 누수가 발생합니까?

Java ServerSocket accept 메소드가 클라이언트의 한 연결 요청에 대해 소켓을 두 번 반환하는 이유는 무엇입니까?

주기적으로 봄 웹 소켓을 통해 클라이언트에 메시지를 보내기

Android 클라이언트에서 Java 서버로 메시지 보내기

Java 서버에서 Android 클라이언트로 : TCP 패킷을 수신 할 수 없습니다.

소켓을 사용하여 TCP를 통해 서버 측에서 클라이언트 측으로 ArrayList <String>을 전송합니까?

소켓이있는 TCP 클라이언트 / 서버, 클라이언트에게 파일을 보내는 서버, 클라이언트 정지, Python

스프링 통합을 사용하여 동시에 여러 클라이언트 연결을 처리하는 TCP 소켓 서버

C ++에서 TCP 소켓을 사용한 원격 클라이언트 및 서버 통신

Android에서 TCP 소켓을 통한 오디오 스트리밍

JAVA 클라이언트에서 서버를 통해 클라이언트로 동시 수정 예외

C 소켓 TCP, 서버에 배열을 보내고 루프에서 클라이언트에 다시 응답

Java / Android : 메서드를 통해 클래스 이름 반환

TCP 연결을 사용하여 Java에서 클라이언트에서 서버로 2D 매트릭스 보내기(소켓 프로그래밍)

Golang TCP 클라이언트가 '스트림 끝'을 Java TCP 서버로 보내지 않음

python 서버가 있지만 C++ 클라이언트로 tcp/ip 소켓을 설정할 수 있습니까?

TOP 리스트

  1. 1

    Ionic 2 로더가 적시에 표시되지 않음

  2. 2

    JSoup javax.net.ssl.SSLHandshakeException : <url>과 일치하는 주체 대체 DNS 이름이 없습니다.

  3. 3

    std :: regex의 일관성없는 동작

  4. 4

    Xcode10 유효성 검사 : 이미지에 투명성이 없지만 여전히 수락되지 않습니까?

  5. 5

    java.lang.UnsatisfiedLinkError : 지정된 모듈을 찾을 수 없습니다

  6. 6

    rclone으로 원격 디렉토리의 모든 파일을 삭제하는 방법은 무엇입니까?

  7. 7

    상황에 맞는 메뉴 색상

  8. 8

    SMTPException : 전송 연결에서 데이터를 읽을 수 없음 : net_io_connectionclosed

  9. 9

    정점 셰이더에서 카메라에서 개체까지의 XY 거리

  10. 10

    Windows cmd를 통해 Anaconda 환경에서 Python 스크립트 실행

  11. 11

    다음 컨트롤이 추가되었지만 사용할 수 없습니다.

  12. 12

    C #에서 'System.DBNull'형식의 개체를 'System.String'형식으로 캐스팅 할 수 없습니다.

  13. 13

    JNDI를 사용하여 Spring Boot에서 다중 데이터 소스 구성

  14. 14

    Cassandra에서 버전이 지정된 계층의 효율적인 모델링

  15. 15

    복사 / 붙여 넣기 비활성화

  16. 16

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

  17. 17

    Google Play Console에서 '예기치 않은 오류가 발생했습니다. 나중에 다시 시도해주세요. (7100000)'오류를 수정하는 방법은 무엇입니까?

  18. 18

    SQL Server-현명한 데이터 문제 받기

  19. 19

    Seaborn에서 축 제목 숨기기

  20. 20

    ArrayBufferLike의 typescript 정의의 깊은 의미

  21. 21

    Kubernetes Horizontal Pod Autoscaler (HPA) 테스트

뜨겁다태그

보관