본문 바로가기

JAVA

자바채팅프로그래밍 -UDP소켓이용 계산기

이 프로그램은 클라이언트에서 띄운 GUI에 원하는 연산을 입력하면 서버에서 그 연산을 계산해 결과를 클라이언트에 다시 보내주는 방식으로 동작한다.

 

//서버

package chap6;

import java.io.*;
import java.net.*;
import java.util.LinkedList;


public class CulculationServer {
	
	public static void main(String args[]) {
		DatagramPacket sendPacket;
		DatagramPacket receivePacket;
		DatagramSocket socket;
		double result=0;
		char ch, op=0;
		String preNum,lastNum;
		int spre;
		double lpre;

	    byte[] data= new byte[200];  
			try{			
				socket = new DatagramSocket(4000);
				DatagramPacket receivepacket = new DatagramPacket(data, data.length);
				socket.receive(receivepacket);
				String what = new String(data);
				
				for(int i =0; i<3; i++){
                //한글자씩 잘라내기
					 ch = what.charAt(i); 
					
                    //만약 연산자가 나오면 연산자를 기준으로 자르기
					if(ch=='/'|| ch=='*'||ch=='-'||ch=='+') {
						int idx = what.indexOf(ch);
						op = ch;
                        //숫자 저장 후 string -> int로 변경
						preNum = what.substring(0,idx);
						spre = Integer.parseInt(preNum);
						lastNum = what.substring(idx+1,what.length());
						lpre = Double.parseDouble(lastNum);
						
						//계산
						if(op == '/') {
							result =spre / lpre;	
						} else if(op == '*') {
							result = spre * lpre;
			
						}else if(op == '+') {
							result = spre + lpre;

						}else if(op == '-') {
							result = spre - lpre;
						}
                        //계산값 소켓을 통해 보내주기
						data = String.valueOf(result).getBytes();	
						sendPacket = new DatagramPacket(data,data.length,InetAddress.getLocalHost(),5000);
						socket.send(sendPacket);
						
					}
				}
				

			}catch(SocketException se) {
				System.out.println(se);
			}catch(IOException e) {
				System.out.println(e);
			}catch(NumberFormatException e1){
				
			}
	}
	}

 

//클라이언트

package chap6;
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;

public class CulculationClient extends Frame implements ActionListener{
	private TextField enter;
	private TextArea display;
	private DatagramPacket sendPacket, receivePacket;
	private DatagramSocket socket;
	
	public CulculationClient(){
		super("계산기");
		enter = new TextField("식을 입력하세요");
		enter.addActionListener(this);
		add(enter,BorderLayout.NORTH);
		display = new TextArea();
		add(display, BorderLayout.CENTER);
		addWindowListener(new WinListener());
		setSize(400,200);
		setVisible(true);
		try{
			socket = new DatagramSocket(5000);
		}catch(SocketException se){
			se.printStackTrace();
			System.exit(1);
		}
	}

	public void actionPerformed(ActionEvent e) {
		try {

				String s = e.getActionCommand();			
				byte data[] = s.getBytes();
				sendPacket = new DatagramPacket(data, data.length,InetAddress.getLocalHost(),4000);
				socket.send(sendPacket);
				
				byte data1[] = new byte[200];
				receivePacket = new DatagramPacket(data1, data1.length);
				socket.receive(receivePacket);
				display.append(new String(receivePacket.getData()));
				display.append("\n");
			}catch(IOException exception) {
				display.append(exception.toString() + "\n");
				exception.printStackTrace();
			}
	}	
	public static void main(String args[]){
		CulculationClient s = new CulculationClient();
	}
	class WinListener extends WindowAdapter{
		public void windowClosing(WindowEvent we) {
		System.exit(0);
		}
	}
}

//결과