결국 서버에서 계산을 해줘야해서... 소켓통신을 구현해보기로!
열심히 검색검색을 하는데 죄다 뭔가 안됨 ㅜㅜ
내가 다 수정해야하나 하고 좌절에 빠져있었는데 !! 발견했다 완벽한 코드를 !! 호호호호
원출처는 여기 http://wndrlf2003.blog.me/70171460317
근데 접때 검색할때 분명 main activity에 thread있음 안된다 했는데 잘되넹
저건 안에서 선언은 있지만 실제로 main에서 하는건 run 이라 그런가...?
처음에 서버로 접속이 안되서 안되는줄 알았는데 알고보니 소켓통신을 하려면
1. Server가 고정 ip이거나
2. 같은 네트워크상에 있어야 한다.
내 노트북이 고정 ip가 아니므로.. wifi를 잡은후 프로그램을 실행시켰더니 아주 잘된당!
이제 여러 client로 돌릴수있게 만들고,
client와 접속이 끊어져도 server프로그램이 계속 실행되어 있게 수정 해야한다!!!
할수있겠지? ㅋㅋㅋㅋ
1. TCP Server :
포트를 열어주고, Client로 부터 들어온 값을 이용해서 계산 후 다시 보내준다.
Client에서 들어오는 Stream은 하난데, 실제로는 "|"연산자를 기준으로 구분되는 데이터들이기 때문에
데이터를 쪼개(?)주는 split 함수를 추가했다
서버 ip가 바뀔때마다 cmd에서 확인하는게 귀찮아서 ip를 뿌려주는 함수도 추가했다.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; import java.util.Collections; import java.util.Enumeration; public class TCPServer { //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); //서버소켓 생성 boolean bLoopBack = true; String strIP = null; // 여기 IP주소가 담기게 된다. try { Enumerationnets = NetworkInterface.getNetworkInterfaces(); for( NetworkInterface netint : Collections.list(nets) ) { if( netint.isLoopback() == true ) continue; Enumeration inetAddresses = netint.getInetAddresses(); for( InetAddress inetAddress : Collections.list(inetAddresses) ) { if( inetAddress.getHostAddress() != null && inetAddress.getHostAddress().indexOf('.') != -1 ) { strIP = inetAddress.getHostAddress(); bLoopBack = false; } } if( bLoopBack == false ) break; } } catch( SocketException e ) { return; } try { // 서버 소켓을 만들고 연결을 기다린다. System.out.println("서버아이피="+strIP); 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); //저장된값 콘솔 출력 // inputLine = String.valueOf(Integer.valueOf(inputLine)*100); String[] result = inputLine.split("\\|"); System.out.println(result[0]+"+"+result[1]); String outputLine = String.valueOf(Integer.valueOf(result[0])+Integer.valueOf(result[1])); out.println(outputLine); //돌아온값을 다시 되돌려 보낸다. //String이 stream으로 변환되어 전송됨. if (inputLine.equals("quit")) //만약 받은 값이 quit 일경우 종료 break; } out.close(); in.close(); clientSocket.close(); serverSocket.close(); //열린 모든것을 닫아준다. } catch (Exception e) { System.out.println("error"); e.printStackTrace(); } } }
2. TCP Client :
Server에 접속하고, 버튼을 누르면 입력한 데이터를 Server로 보내준다.
Server에서 되돌아온 값을 다시 Text View를 통해 보여준다.
2.1 java
package com.example.tcpclient; 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 input1; //화면구성 EditText input2; Button button; //화면구성 TextView output; //화면구성 String data; // @Override protected void onCreate(Bundle savedInstanceState) { //앱 시작시 초기화설정 super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //start input1 = (EditText) findViewById(R.id.input01); // 글자입력칸을 찾는다. input2 = (EditText) findViewById(R.id.input02); button = (Button) findViewById(R.id.button); // 버튼을 찾는다. output = (TextView) findViewById(R.id.output); // 글자출력칸을 찾는다. // 버튼을 누르는 이벤트 발생, 이벤트 제어문이기 때문에 이벤트 발생 때마다 발동된다. 시스템이 처리하는 부분이 무한루프문에 //있더라도 이벤트가 발생하면 자동으로 실행된다. button.setOnClickListener(new OnClickListener() { public void onClick(View v) { //버튼이 클릭되면 소켓에 데이터를 출력한다. String data = input1.getText().toString()+"|"+input2.getText().toString(); //글자입력칸에 있는 글자를 String 형태로 받아서 data에 저장 if (data != null) { //만약 데이타가 아무것도 입력된 것이 아니라면 out.println(data); //data를 stream 형태로 변형하여 전송. 변환내용은 쓰레드에 담겨 있다. } } }); Thread worker = new Thread() { //worker 를 Thread 로 생성 public void run() { //스레드 실행구문 try { //소켓을 생성하고 입출력 스트립을 소켓에 연결한다. socket = new Socket("192.168.0.21", 5555); //소켓생성 out = new PrintWriter(socket.getOutputStream(), true); //데이터를 전송시 stream 형태로 변환하여 //전송한다. in = new BufferedReader(new InputStreamReader( socket.getInputStream())); //데이터 수신시 stream을 받아들인다. } catch (IOException e) { System.out.println("클라이언트-연결실패"); 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 { if (socket != null) socket.close(); //소켓을 닫는다. } catch (IOException e) { e.printStackTrace(); } } }
2.2 main xml
2.3 manifest.xml
MFC | OpenCV 개발환경 (0) | 2014.11.14 |
---|---|
Tistory | 게시글 썸네일(Thumbnail) 지정하기 (0) | 2014.10.19 |
Tistory | 최근포스트(Recent Post) 접기 (0) | 2014.10.15 |
Tistory | HTML을 이용하여 소스코드 올리기 (0) | 2014.10.05 |
Android | XML 데이터 파싱 (서버에서 데이터 받아오기) (0) | 2014.07.25 |
Andriod | 내비게이션 탭 (0) | 2014.07.13 |
Android | 프로젝트생성 (0) | 2014.07.13 |
Android | 개발환경 (0) | 2014.07.11 |