본문 바로가기
알고리즘 문제 풀이/Power JAVA

p768) 4번 문제 - 영어 단어를 보내 한글로 번역하시오(Thread)

by kakk789 2022. 4. 14.
- TCP Socket 통신 해야함
- JTextField 에 입력 값을 JTextField 로 출력
- 영어 단어를 한글로 번역
- 여러명의 클라이언트들이 동시에 사용할 수 있어야함
- 서버 측에 Thread 객체를 생성하여 매개변수로 해당 정보를 담는 socket을 전달해야함.

Client 코드

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Arrays;
import java.util.Scanner;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class DictionaryClient_TEST extends JFrame implements ActionListener{

	JTextField jtf;
	JTextArea jta;
	Socket socket;
	InputStream is;
	OutputStream os;
	
	public DictionaryClient_TEST() {
		try {
			//서버에게 통신을 요청
			socket = new Socket("14.37.56.228",9003);

			is = socket.getInputStream();
			os = socket.getOutputStream();
			
			jtf = new JTextField(40);
			jta = new JTextArea(80,50);
			JScrollPane jsp = new JScrollPane(jta);
			
			JButton btnSend = new JButton("전송");
			btnSend.addActionListener(this);
			
			JPanel p = new JPanel();
			p.add(jtf);
			p.add(btnSend);
			
			add(jsp, BorderLayout.CENTER);
			add(p, BorderLayout.NORTH);
			
			setSize(600,400);
			setVisible(true);
			setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			
		}catch (Exception e) {
			System.out.println("에러발생: "+e.getMessage());
		}
	}

	@Override
	public void actionPerformed(ActionEvent e) {

			byte []data;
			try {
				System.out.println("actionPerformed 내부");
				
				data = new byte[100];
				String eng;
				String kor;
				eng=jtf.getText();
	
				os.write(eng.getBytes());
				
				if (eng.equals("q!")) {
					System.exit(0);;
				}
				
				is.read(data);
				
				kor =new String(data);
				jta.append(kor+"\n");
				
				System.out.println("서버로부터 수신된 번역 결과: " + kor);
				Arrays.fill(data,  (byte)0);

			} catch (Exception ex) {
				ex.printStackTrace();
			}
	}
	
	public static void main(String[] args) {
		new DictionaryClient_TEST();
	}
}

Server 코드

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
import java.util.HashMap;

class ServerThread extends Thread{
	
	Socket socket;
	InputStream is;
	OutputStream os;
	HashMap<String, String> map = new HashMap<String, String>();

	//수신된 데이터를 받기 위한 배열 생성
	byte []data = new byte[100];
	
	
	//객체 생성 시에 소켓을 전달받아서 스트림을 생성.
	public ServerThread(Socket socket) {
		try {
			this.socket = socket;
			is = socket.getInputStream();
			os = socket.getOutputStream();
			
		}catch(Exception e) {
			
		}
	}

	@Override
	public void run() {
		map.put("apple", "사과");
		map.put("grape", "포도");
		map.put("watermelon", "수박");
		map.put("strawberry", "딸기");
		while(true) {

			//데이터를 주고받기 위한 스트림을 생성

			try{
				InputStream is = socket.getInputStream();
				OutputStream os = socket.getOutputStream();
				//클라이언트가 보내오는 데이터를 계속 받음.
				while(true) {
					
				//클라이언트의 입력 값을 data에 저장
					is.read(data);
					
				//받아온 데이터가 담긴 배열을 갖고 문자열 생성
					String eng = new String(data).trim();
					
				//수신된 문자열이 q!이면 종료
					if (eng.equals("q!")){
						break;
					}
					
				//영어사진이 담긴 맵으로부터 영어단어를 키로하여 한국어를 뽑아옴
					String kor = map.get(eng);
					
				//만약에 사전에 등록되어 있지 않으며 없음을 저장
					if (kor == null) {
						kor="없음";
					}
					
				//뽑아온 한국어를 클라이언트로 보냄.
					os.write(kor.getBytes());
					
					System.out.println(eng + "에 대한 번역 "+ kor 
					 + "을 전송하였습니다.");
					
					//다음 데이터 수신을 위해 배열을 클리어
					Arrays.fill(data,  (byte)0);
				}
			}catch(Exception e) {
				
			}
		}
	}
}

public class DictionaryServer_TEST {

	public static void main(String[] args) {
		
		try {
			//TCP 방식의 통신을 위하여 서버소켓을 생성
			ServerSocket server = new ServerSocket(9003);
			System.out.println("클라연결 대기중");
			
			//클라이언트가 보내오는 데이터를 받기 위한 배열을 만듦
			byte []data = new byte[100];
			
			//클라이언트의 접속을 위하여 무한 대기 상태
			while(true) {
				//클라이언트의 접속을 수락
				Socket socket=server.accept();
				System.out.println("클라와 연결되었습니다");
				ServerThread thread = new ServerThread(socket);
				thread.start();
				System.out.println("연결 종료");
			}

		}catch (Exception e) {
			// TODO: handle exception
		}	
	}
}
반응형

댓글