- 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
}
}
}
반응형
'알고리즘 문제 풀이 > Power JAVA' 카테고리의 다른 글
p768) 5번 문제 - 시간 서버를 만들어 Client에게 시간을 전송해라(Thread이용) (0) | 2022.04.14 |
---|---|
p596)10번 문제 - 로또 번호 생성 (TreeSet 사용) (0) | 2022.04.09 |
p596)9번 문제 - 심사위원 10명의 점수를 입력 받아라(최고점수, 최저점수 제외) (0) | 2022.04.09 |
p595) 문제 7번 - 국가를 입력하여 수도를 출력하시오(Map 사용) (0) | 2022.04.09 |
p595) 8번 문제 - 이름이 등장하는 횟수를 Map에 저장해보자 (0) | 2022.04.09 |
댓글