안드로이드 개발 질문/답변
(글 수 45,052)
소켓통신으로 계산기 구현하고 있습니다.
먼저 server(Android) 부분에서 익셉션이 발생해서 ,thread를 실해하지 못하고 있는거 같습니다.
왜 그런지 좀 도와주세요 그리고, thread에서 TextView 를 사용하려면 Handler를 사용해야 된다고 해서 책보고 한다고 했는데 이해가 잘 안되서 제대로 된 것인지 잘 모르겠네요 이부분도 좀 봐주셨으면 감사하겠습니다. 이거한다고 거의 5일째 밤새고 있습니다.ㅠㅠ
== Server 메인부분입니다====
public class CalculClient extends Activity {
/** Called when the activity is first created. */
ServerSocket serverSocket = null;
Socket socket = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = (TextView)findViewById(R.id.getData);
final TextView tv2 = (TextView)findViewById(R.id.result);
try{
serverSocket = new ServerSocket(5777);
ServerThread thread = new ServerThread();
thread.start();
Handler mHandler = new Handler(){
public void handleMessage(Message msg){
if(msg.what == 0){
tv2.setText((CharSequence) msg.obj);
}
}
};
}
catch(Exception e){
}
finally{
try{
serverSocket.close();
}catch(Exception ignored){;}
}
} }
그리고 server Thread 부분입니다.
public class ServerThread extends Thread {
ServerSocket serverSokcet = null;
Socket socket = null;
BufferedReader br = null;
BufferedWriter bw = null;
Handler mHandler;
public ServerThread() {
// TODO Auto-generated constructor stub
try{
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
}
catch(IOException ioe){
}
}
ServerThread(Handler handler){
mHandler = handler;
}
public void run(){
String packet="";
while(true){
try{
socket = serverSokcet.accept();
packet = br.readLine();
if(packet != null){
Message msg = Message.obtain();
msg.what =0;
msg.obj = packet;
mHandler.sendMessage(msg);
String result = analPacket(packet);
bw.write(result);
bw.newLine();
bw.flush();
}
}
catch(IOException ioe){
try{
br.close();
bw.close();
socket.close();
}catch(IOException ex){
}
break;
}
}
}
public String analPacket(String str){
StringTokenizer st = new StringTokenizer(str,":");
String operator ="";
int x,y,result=0;
String packet = "";
boolean success =true;
operator = st.nextToken().toString();
try{
x=Integer.parseInt(st.nextToken().trim());
y=Integer.parseInt(st.nextToken().trim());
if(operator.equals("+")){
result = x+y;
}else if(operator.equals("-")){
result = x-y;
}else if(operator.equals("*")){
result = x*y;
}else if(operator.equals("/")){
if(y != 0){
result = x/y;
}else{
packet="you can't devide zero";
success = false;
}
}else{
packet = "It's error";
success = false;
}
if(success){
packet = "receive data " + result + ":";
}
}
catch(NumberFormatException e){
packet = "it's not integer";
}
return packet;
}
}
client 부분(PC) 코드도 같이 올립니다.
public class Calculator {
public static void main(String args[]) {
String del[]={"+","-","*","/"};
String op="";
int op_count=0;
String ip="xxx.xxx.xxx.xxx";
int port=5777;
String str="";
BufferedReader console=new BufferedReader(new InputStreamReader(System.in));
boolean conti=true;
int x,y;
CalculClient c=new CalculClient();
if (args.length>0) {
try {
port=Integer.parseInt(args[0]);
} catch (NumberFormatException e) { }
if (args.length>1) ip=args[1];
}
try {
c.socket_connect(ip, port);
} catch (IOException e) {
System.out.println("\nCan not find Calculator Server.");
System.out.println("usage: java Calculator [port] [server IP]");
System.exit(-1);
}
while (conti) {
try {
System.out.print("\n수식 또는 bye를 입력하세요:");
str=console.readLine();
} catch (IOException e) { }
if (str.equals("bye")) { break; }
op_count=0;
for (int i=0; i<4; i++) {
if (str.indexOf(del[i])>0) {
op_count++;
op=del[i];
}
}
if (op_count!=1) {
System.out.println("+,-,*,/ 중 하나의 연산자를 사용하세요");
} else {
StringTokenizer st=new StringTokenizer(str, op);
try {
x=Integer.parseInt(st.nextToken());
y=Integer.parseInt(st.nextToken());
try {
c.calcul(x,y,op);
} catch (IOException e) {
System.out.println("데이터 전송에 실패했습니다.");
}
if (c.isSuccess()) {
System.out.println("계산 결과:"+c.getResult());
} else {
System.out.println("에러:"+c.getError());
}
} catch (NumberFormatException e) {
System.out.println("정수만 입력하세요.");
}
}
}
}
}
import java.io.*; import java.net.*; import java.util.*;
public class CalculClient {
private int result=0; // 결과값이 전송됩니다. private String error=""; // 에러메시지가 들어갑니다. private boolean success=false; // 계산이 성공했으면 true값으로
String ip="xxx.xxx.xxx.xxx";
int port=5777;
Socket socket=null;
BufferedReader br=null;
BufferedWriter bw=null;
public CalculClient() {
ip="xxx.xxx.xxx.xxx";
port=5777;
}
public CalculClient(String ip, int port) {
this.ip=ip;
this.port=port;
}
public int getResult() {
return result;
}
public String getError() {
return error;
}
public boolean isSuccess() {
return success;
}
// Connect Socket in default ip and port
public void socket_connect() throws IOException {
try {
socket_connect(ip, port);
} catch (IOException e) {
throw e;
}
}
// Connect Socket in given IP and port
public void socket_connect(String ip, int port) throws IOException {
try {
socket=new Socket(ip, port);
br=new BufferedReader(new InputStreamReader( socket.getInputStream() ) );
bw=new BufferedWriter(new OutputStreamWriter( socket.getOutputStream() ) );
} catch (IOException e) {
success=false;
error="Error in Socket Connection";
throw e;
}
}
// Close the socket
public void socket_close() throws IOException {
try {
br.close();
bw.close();
socket.close();
} catch (IOException e) {
success=false;
error="Error in Socket Closing";
throw e;
}
}
// Calculate given statement
public void calcul(int x, int y, String opp) throws IOException {
String packet="";
String receivedPacket="";
try {
packet=opp+":"+x+":"+y+":";
bw.write(packet);
bw.newLine();
bw.flush();
receivedPacket=br.readLine();
StringTokenizer st=new StringTokenizer(receivedPacket, ":");
String tmp=st.nextElement().toString();
if (tmp.equals("s")) {
result=Integer.parseInt( st.nextToken().trim() );
success=true;
} else {
error=st.nextToken().toString();
success=false;
}
} catch (IOException e) {
success=false;
error="Error in Data Transmission";
throw e;
}
}
// This Method for Testing
public static void main(String args[]) {
CalculClient c=new CalculClient();
int port=5777;
String ip="xxx.xxx.xxx.xxx";
if (args.length>0) {
try {
port=Integer.parseInt(args[0]);
} catch (NumberFormatException e) { }
if (args.length>1) ip=args[1];
}
try {
c.socket_connect(ip, port);
} catch (IOException e) {
System.out.println("\nCan not find Calculator Server.");
System.out.println("usage: java CalculClient [port] [server IP]");
System.exit(-1);
}
try {
c.calcul(12,32,"+");
System.out.println("12 + 32 = "+c.getResult());
c.calcul(32,23,"-");
System.out.println("32 - 23 = "+c.getResult());
c.calcul(23,0,"/");
System.out.println("23 / 0 : "+c.getError());
} catch (IOException e) { }
}
}



