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

소켓통신에서 두개의 클라이언트 데이터받기 질문입니다.

0 추천
package com.example.appser;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class MainActivity extends Activity {

 String message = "";
 ServerSocket serverSocket;
 Paint pnt = new Paint();
 MainView mainView;
 int[] x = new int[12];
 int[] y = new int[12];
 int[] color = new int[12];
 //Socket sock;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  Log.d("test", "wwwwwwwwwwwwstart");
  setContentView(R.layout.activity_main);
  //각원 좌표값 위치설정
  x[0] = 280;
  y[0] = 110;
  x[1] = 270;
  y[1] = 230;
  x[2] = 190;
  y[2] = 260;
  x[3] = 110;
  y[3] = 290;
  x[4] = 150;
  y[4] = 480;
  x[5] = 220;
  y[5] = 650;
  
  x[6] = 460;
  y[6] = 110;
  x[7] = 460;
  y[7] = 230;
  x[8] = 540;
  y[8] = 260;
  x[9] = 620;
  y[9] = 290;
  x[10] = 600;
  y[10] = 480;
  x[11] = 510;
  y[11] = 650;
  
  for(int i = 0; i < 12; i ++)
  {
     // x[i] = 100 + 100*i;
     // y[i] = 100 + 100*i;
      color[i] = Color.BLACK;
  }
   
  
  mainView = new MainView(this);
  setContentView(mainView);
 }

 @Override
 protected void onDestroy() {
  super.onDestroy();

  if (serverSocket != null) {
   try {
    serverSocket.close();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }

 protected class MainView extends View {

     private int mPintSize = 0;

     private Map<Integer, Integer> mPointSizeMap = new HashMap<Integer, Integer>();
     private Map<Integer, Integer> mPointItemSizeMap = new HashMap<Integer, Integer>();
     
     public MainView(Context context) {
         super(context);
         
         mPointSizeMap.put(0, 10);
         mPointSizeMap.put(1, 20);
         mPointSizeMap.put(2, 30);
         mPointSizeMap.put(3, 40);
         mPointSizeMap.put(4, 50);
         mPointSizeMap.put(5, 60);
         mPointSizeMap.put(6, 70);
         
         new Thread(new Runnable() {
             
             public void run() {
                 while(true){
                     try {
                            serverSocket = new ServerSocket(5000, 10);
                              //Socket sock = new Socket("172.30.1.16", 5678);
                              //app을 클라이언트로 바꿀시 ip주소 찾는버ㅂ

                            while (true) {
                             Socket sock = serverSocket.accept();
                             InetAddress  inetaddr = sock.getInetAddress();
                             OutputStream out = sock.getOutputStream();
                             InputStream in = sock.getInputStream();
                             BufferedReader br = new BufferedReader(new InputStreamReader(in));

                             String line = null;
                             int aplug, index;
                             int flag = 0, count = 0;;
                             while((line = br.readLine()) != null){
                                        
                                         aplug = Integer.parseInt(line);
                                         index = aplug / 10000;
                                         aplug = aplug % 10000;
                                         Log.d("test", "wwwwwww"+aplug+", index = "+index);
                                         if(index == 0)
                                         {
                                             if(aplug != 0)
                                                 flag = 1;
                                             else if (flag == 1)
                                             {
                                                 flag = 0;
                                                 count++;
                                             }
                                         }
                                        
                                        
                                         mPointItemSizeMap.put(index, getPointItemSize(aplug));
                                        
                                         postInvalidate();
                                     // ondraw 다시 호출
                             }
                            }
                           } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                           }
                 }
             }

            private int getPointItemSize(int aplug) {
               
                int mRet = 0;
               
                if (aplug >=800){
                    mRet = 0;
                }else if (aplug < 800 && aplug >= 600){
                    mRet = 1;
                }else if (aplug < 600 && aplug >= 400){
                    mRet = 2;
                }else if (aplug < 400 && aplug >= 200){
                    mRet = 3;
                }else if (aplug < 200 && aplug >= 30){
                    mRet = 4;
                }else if (aplug < 30 && aplug >= 10){
                    mRet = 5;
                }else if (aplug < 10){
                    mRet = 6;
                }else{
                    throw new IllegalAccessError("에러");
                }
               
                return mRet;
            }
           }).start();
     }

     private final int DEFAULT_SIZE = 5;   
     
        public void onDraw(Canvas canvas) {

            // canvas.drawColor(Color.WHITE);

            // Paint 생성 & 속성 지정
            Paint Pnt = new Paint();
            Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.foot);
            Rect rtDest = new Rect(0, 0, 740, 800);
            canvas.drawBitmap(bitmap, null, rtDest, null);

            for (int i = 0; i < 12; i++) {
                pnt.setStyle(Style.FILL);
                pnt.setStrokeWidth(1);
//                pnt.setColor(color[i]);
                pnt.setColor(Color.RED);

                Log.e("suein", "index = "+i+", value = "+mPointItemSizeMap.get(i));
               
                Integer mPointSize = mPointSizeMap.get(mPointItemSizeMap.get(i));
                if (mPointSize == null) {
                    canvas.drawCircle(x[i], y[i], DEFAULT_SIZE, pnt);

                } else {
                    canvas.drawCircle(x[i], y[i], mPointSize, pnt);
                }
           
                // x축 , y축 , 반지름 설정하는것
            }

        }
 }
}

클라이언트 하나에서는 데이터를 받는것을 확인하였는데 두개의클라이언트를 하려고 할때 문제가 있어서 올립니다. 서버에 소켓을 두개생성해야되고 스레드도 손을 봐야한다는데.. 어떤식으로 하는지 잘 모르겟습니다.. 소스 수정을 어디를 해야되는것일까요 ㅜㅜ
익명사용자 님이 2015년 11월 10일 질문
2015년 11월 10일 수정

1개의 답변

0 추천
new Thread(new Runnable() {

.....

 }).start();

까지가 thread를 만드시고 실행시키신 것입니다. (child thread).

이미 여기서 벌써 멀티쓰레드가 되신거고 부모와 자식으로 구성된 2개의 쓰레드를 구성한 것입니다.

지인분의 말씀인즉 인제 자식을 여러게 만들어서 하라고 하신것으로 파악됩니다.

mulit-thread 무엇인지는 아시는 것이지요?

저런 thread 여러개 만들어서 수행시키시면 되는 부분인데요..

혹 thread에 관한 잘 모르신다면 thread라는 것에 대해서 공부를 좀하시는 것이 많은 도움이 될 것 같습니다.

muti-thread 이런 부분들은 공부할 내용이 좀됩니다.
컴러기 (22,230 포인트) 님이 2015년 11월 10일 답변
...