0. 설명
저번에 한 블로그를 보면
"서버"코드를 보면
[Android] 4000 - 1.소켓("서버", "클라이언트" 설명, 간단 사용법)
안 좋은점 - > ServerThread클래스를 보면 MainActivity.java 안에 들어가 있습니다.
이렇게 실행하면,
서버를 띄워 놓아야 하니깐 화면(서버가 들어가 있는)을 계속 띄워 놓아야 합니다.
이렇게 하면 안좋음.....
이런 경우에는 "서비스"로 구성을 해줘야 합니다!!!
죽지 않게!!!
1. 서비스 생성
1) 서비스 생성
2) 오버라이드
3) "서버" 코드에 있던 걸 "서비스"코드로 알맞게 옮겼습니다.
"서비스"객체를 처음에 사용하는 곳에서 startService()를 한다면,
스레드가 만들어 지면서,
서버가 대기하는 상황이 됩니다!
-변경 코드-
첫번째 -> ChatService.java에서 "소켓서버스레드"를 계속 돌리게 변경했습니다.!! (밑에 그림)
두번째 -> 월래 "메인"에서 "소켓서버스레드" 돌렸던거 주석 달고, (밑에 그림)
인텐트를 서비스로 보내서 서비스 실행하게 만듬.
2. 코드 (서버, 클라이언트)
2개 프로젝트 만듬 - MyServer프로젝트(서버) , MySocket프로젝트(클라이언트)
MyServer프로젝트(서버) -> MainActivity.java, ChatService.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// SocketServerThread thread = new SocketServerThread();
// thread.start();
Intent intent = new Intent(getApplicationContext(),ChatService.class);
startService(intent);
}
});
}
/*
// 서버 기능
class SocketServerThread extends Thread{
public void run(){
int port = 5001;
try {
ServerSocket server = new ServerSocket(port);
Log.d("서버스레드","서버가 실행됨");
while (true){
Socket socket = server.accept(); // -> 대기상태 입니다.
ObjectInputStream inputStream =new ObjectInputStream(socket.getInputStream()); // -> 들어오는 데이터를 처리하는 거
Object input = inputStream.readObject(); // inputStream에서 "클라이언트"쪽에서 보내온 객체를 읽어 올 수가 있습니다.
Log.d("서버스래드","받은 데이터 :" + input);
ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream()); // 현재 "서버"에서 "클라이언트" 쪽으로 데이터를 보낼 겁니다.
outputStream.writeObject(input + "<- 서버에서 보낸 데이터");// 객체를 쓸 수가 있다
outputStream.flush(); // OutputStream에서 write를 하면 버퍼에 남아 있을 수가 있으므로, 꼭 flush()를 해줘야 한다.
Log.d("서버스래드", "output 보냄");// 데이터를 "클라이언트"쪽으로 보냈다라고 하면 확인차 찍어보기
socket.close();// "클라이언트"의 요청을 전부다 처리하고 나면 socket객체를 끝내준다!
}
}catch (Exception e){
e.printStackTrace();
}
}
}
*/
}
public class ChatService extends Service {
public ChatService() {
}
@Override
public void onCreate() {
super.onCreate();
SocketServerThread thread = new SocketServerThread();
thread.start();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
// 서버 기능
class SocketServerThread extends Thread{
public void run(){
int port = 5001;
try {
ServerSocket server = new ServerSocket(port);
Log.d("서버스레드","서버가 실행됨");
while (true){
Socket socket = server.accept(); // -> 대기상태 입니다.
ObjectInputStream inputStream =new ObjectInputStream(socket.getInputStream()); // -> 들어오는 데이터를 처리하는 거
Object input = inputStream.readObject(); // inputStream에서 "클라이언트"쪽에서 보내온 객체를 읽어 올 수가 있습니다.
Log.d("서버스래드","받은 데이터 :" + input);
ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream()); // 현재 "서버"에서 "클라이언트" 쪽으로 데이터를 보낼 겁니다.
outputStream.writeObject(input + "<- 서버에서 보낸 데이터");// 객체를 쓸 수가 있다
outputStream.flush(); // OutputStream에서 write를 하면 버퍼에 남아 있을 수가 있으므로, 꼭 flush()를 해줘야 한다.
Log.d("서버스래드", "output 보냄");// 데이터를 "클라이언트"쪽으로 보냈다라고 하면 확인차 찍어보기
socket.close();// "클라이언트"의 요청을 전부다 처리하고 나면 socket객체를 끝내준다!
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}
MySocket프로젝트(클라이언트) -> MainActivity.java
public class MainActivity extends AppCompatActivity {
TextView textView;
Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 스래드 만들고 접속하도록
ClientThread thread = new ClientThread();
thread.start();
}
});
}
class ClientThread extends Thread{
public void run(){
String host ="localhost"; //자기자신
int port = 5001; // 포트 동일하게 5001지정!!!
try {
Socket socket = new Socket(host,port);
ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream()); // 보내기 위한 통로가 만들어 짐.
outputStream.writeObject("안녕! 나 클라이언트에서 보냄");
outputStream.flush(); // write쓸 때는 flush 해줘라!!
Log.d("클라이언트스레드","서버로 보냄");
ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream()); // 들어오는 통로 만들어 짐.
final Object input = inputStream.readObject(); // 받는 데이터
Log.d("클라이언트스레드", "받은 데이터 : "+input);
handler.post(new Runnable() {
@Override
public void run() {
textView.setText("받은 데이터 : "+input);
}
});
}catch (Exception e){
e.printStackTrace();
}
}
}
}
'■ Android > Tip' 카테고리의 다른 글
[Android] 30 - 2.웹으로 요청하기(HttpURLConnection) (0) | 2020.02.14 |
---|---|
[Android] 30 - 1.HTTP 이해하기 (0) | 2020.02.14 |
[Android] 20 - 2.소켓(핸들러 사용) - "클라이언트"의 UI 업데이트 (0) | 2020.02.12 |
[Android] 10 - 5.스레드 사용하기(코드), AsyncTask 사용 ★ (0) | 2020.02.10 |
[Android] 10 - 4.스레드 사용하기(코드), 핸들러 사용 ★★(더 간단한 방법으로 핸들러 사용!) (0) | 2020.02.09 |