마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

자바서버 안드로이드 클라 소켓통신

0 추천

구글에 한 예제인데 여기서 앱실행하고 연결한뒤 앱종료시 서버가 같이 종료됩니다 if quit부분 close부분 다 주석처리하고 시도해봣는데 서버에 null값이 계속 보내집니다. 앱종료를해도 서버가 살아있어서 다시 앱을 실행했을때 연결할수 있었음 좋겠는데 어떻게 하면 될가요?

 

 

자바 서버 

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 nstart {   //nstart 대신에 사용하시는 클래스 이름을 적으셔요

public static void main(String[] args) throws IOException {  // 메인함수, IOException

ServerSocket serverSocket = null; //서버소켓 생성

Socket clientSocket = null; // 서버소켓이 지정한 포트를 타고온 상대 ip를 저장할 수 있다.

PrintWriter out = null;  // String 타입의 문자를 보낼수 있는 함수.

BufferedReader in = null;//stream 타입의 문자를 읽어서 저장할 수 있는 함수.

 

serverSocket = new ServerSocket(5555); //서버소켓 생성

 

try {

// 서버 소켓을 만들고 연결을 기다린다.

clientSocket = serverSocket.accept(); //클라이언트로부터 데이터가 오는것을 감지한다.

System.out.println("클라이언트 연결");

 

// 클라이언트로 부터 데이터를 받는다.

out = new PrintWriter(clientSocket.getOutputStream(), true); //String 타입을 stream 형태로 변환하여 

                                                                                                            //전송한다는 뜻.

in = new BufferedReader(new InputStreamReader(

clientSocket.getInputStream())); //소켓에서 넘오는 stream 형태의 문자를 얻은 후 읽어 들어서                                                                                               //bufferstream 형태로 in 에 저장.

 

while (true) {

String inputLine = null; //in 으로 받아들인 데이터를 저장할 string 생성

inputLine = in.readLine(); //in에 저장된 데이터를 String 형태로 변환 후 읽어들어서 String에 저장

System.out.println("클라이언트로 부터 받은 문자열:" + inputLine); //저장된값 콘솔 출력

out.println(inputLine); //돌아온값을 다시 되돌려 보낸다. //String이 stream으로 변환되어 전송됨.

if (inputLine.equals("quit")) //만약 받은 값이 quit 일경우 종료

break;

}

out.close();

in.close();

clientSocket.close();

serverSocket.close();  //열린 모든것을 닫아준다.

} catch (Exception e) {

e.printStackTrace();

}

}

}

 

 

클라

 

package com.example.android_client;   //패키지는 본인 것으로 수정하셔요

 

 

 

import java.io.BufferedReader;  //우와 많다 ㅎㅎ..

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.Socket;

 

import android.app.Activity;

import android.os.Bundle;

import android.util.Log;

import android.view.Menu;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

 

public class MainActivity extends Activity {    //메인 activity 시작!

 

private Socket socket;  //소켓생성

BufferedReader in;      //서버로부터 온 데이터를 읽는다.

PrintWriter out;        //서버에 데이터를 전송한다.

EditText input;         //화면구성

Button button;          //화면구성

TextView output;        //화면구성

String data;            //

 

@Override

protected void onCreate(Bundle savedInstanceState) {   //앱 시작시  초기화설정

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//start

input = (EditText) findViewById(R.id.input); // 글자입력칸을 찾는다.

button = (Button) findViewById(R.id.button); // 버튼을 찾는다.

output = (TextView) findViewById(R.id.output); // 글자출력칸을 찾는다.

// 버튼을 누르는 이벤트 발생, 이벤트 제어문이기 때문에 이벤트 발생 때마다 발동된다. 시스템이 처리하는 부분이 무한루프문에 

//있더라도 이벤트가 발생하면 자동으로 실행된다.

button.setOnClickListener(new OnClickListener() { 

public void onClick(View v) {

//버튼이 클릭되면 소켓에 데이터를 출력한다.

String data = input.getText().toString(); //글자입력칸에 있는 글자를 String 형태로 받아서 data에 저장

Log.w("NETWORK", " " + data);

if (data != null) { //만약 데이타가 아무것도 입력된 것이 아니라면

out.println(data); //data를   stream 형태로 변형하여 전송.  변환내용은 쓰레드에 담겨 있다.

}

}

});

 

Thread worker = new Thread() {    //worker 를 Thread 로 생성

public void run() { //스레드 실행구문

try {

//소켓을 생성하고 입출력 스트립을 소켓에 연결한다.

socket = new Socket("210.119.104.202", 5555); //소켓생성

out = new PrintWriter(socket.getOutputStream(), true); //데이터를 전송시 stream 형태로 변환하여                                                                                                                       //전송한다.

in = new BufferedReader(new InputStreamReader(

socket.getInputStream())); //데이터 수신시 stream을 받아들인다.

 

} catch (IOException e) {

e.printStackTrace();

}

 

//소켓에서 데이터를 읽어서 화면에 표시한다.

try {

while (true) {

data = in.readLine(); // in으로 받은 데이타를 String 형태로 읽어 data 에 저장

output.post(new Runnable() {

public void run() {

output.setText(data); //글자출력칸에 서버가 보낸 메시지를 받는다.

}

});

}

} catch (Exception e) {

}

}

};

worker.start();  //onResume()에서 실행.

}

 

@Override

protected void onStop() {  //앱 종료시

super.onStop();

try {

socket.close(); //소켓을 닫는다.

} catch (IOException e) {

e.printStackTrace();

}

}

 

}

익명사용자 님이 2019년 8월 9일 질문

1개의 답변

0 추천

보통은 Socket pool 방식을 사용합니다.

 https://jdm.kr/blog/154

익명사용자 님이 2019년 8월 9일 답변
...