본문 바로가기

JAVA/개발

[JAVA] 점수 조회 서버 - 클라이언트

서버에 저장된 학생의 이름과 점수 데이터를 클라이언트로 접속하여 검색하는 프로그램이다.

 

○ 학생 이름과 학점이 저장된 텍스트 파일을 미리 마련해두고, 서버는 이 파일을 읽는다.

○ 클라이언트가 학생 이름을 검색하면 서버는 해당 학생의 학점을 찾아 전송한다. 만약 이름이 존재하지 않는다면 '성적 없는 이름'을 전송한다.

○ 한번에 여러 클라이언트가 서버에 접속할 수 있다.

○ 서버에 클라이언트들의 접속과 검색 기록이 출력된다.

 

복수의 클라이언트 동시 실행

 

코드

 

서버

import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
import java.awt.*;

public class fiveServer extends JFrame{
	private JTextArea ja=new JTextArea();
	private HashMap<String,String> h=new HashMap<String,String>();
	private Socket socket=null;
	private ServerSocket listener=null;
	public fiveServer() {
		setTitle("점수 조회 서버");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		fileRead("score.txt");
		ja.setFont(new Font("Plain",Font.BOLD,15));
		add(ja);
	
		setSize(300,300);
		setLocation(880,420);
		setVisible(true);
		try {
			listener=new ServerSocket(9999);
			while(true) {
			socket=listener.accept();
			ja.append("\n클라이언트 연결됨");
			program pro =new program(socket);
			pro.start();
			}
		}catch(IOException e) {
			System.out.println(e.getMessage());
		}finally {
			try {
				socket.close();
				listener.close();
			}catch(IOException e) {
				System.out.println("오류 발생");
			}
		}
	}
	public void fileRead(String file) {
		try {
			File file1=new File(file);
			BufferedReader bf=new BufferedReader(new InputStreamReader(new FileInputStream(file1),"UTF8"));
			String line="";
			while((line=bf.readLine())!=null) {
				Scanner sc=new Scanner(line);
				h.put(sc.next(), sc.next());
				sc.close();
			}
		}catch(IOException e) {System.out.println("파일 없음");};
		ja.append("score.txt 읽기 완료");
	}
	class program extends Thread{
		Socket socket;
		public program(Socket socket) {
			this.socket=socket;
		}
		public void run() {
			try {
			BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
			BufferedWriter out=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			while(true) {
				String inputMessage=in.readLine();
				if(h.containsKey(inputMessage)) {
					ja.append("\n"+inputMessage+":"+h.get(inputMessage));
					out.write(h.get(inputMessage)+"\n");
					out.flush();
					System.out.println("전송");
				}
				else {
					ja.append("\n"+inputMessage+" 없음");
					out.write("성적 없는 이름\n");
					out.flush();
				}			
			}
		}catch(IOException e) {System.out.println(e.getMessage());}
	}
	}
	public static void main(String[]args) {
		new fiveServer();
	}
}

 

클라이언트

import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class fiveClient extends JFrame{
	private JTextField jt=new JTextField(10);
	private JLabel label=new JLabel();
	private Socket socket=null;	
	public fiveClient() {	
		
		setLayout(new FlowLayout());
		add(new JLabel("이름 입력"));
		add(jt);
		add(label);
		
		try {
			socket=new Socket("localhost",9999);
		}catch(IOException e) {
			System.out.println(e.getMessage());}
		jt.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				try {
					BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
					BufferedWriter out=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
					out.write(jt.getText()+"\n");
					out.flush();
					String result=in.readLine();
					label.setText(result);
				}catch(IOException e1) {System.out.println(e1.getMessage());}
			}		
		});
		setTitle("스펠체크 클라이언트");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocation(1080,420);
		setSize(400,150);
		setVisible(true);	
	}
	public static void main(String[]args) {
		new fiveClient();
	}
}

'JAVA > 개발' 카테고리의 다른 글

[JAVA] 이미지 파일 전송 서버 - 클라이언트  (0) 2023.02.22
[JAVA] 영어 사전 서버 - 클라이언트  (0) 2023.02.22
[JAVA] 오디오 플레이어  (0) 2023.02.21
[JAVA] 산성비 게임  (0) 2023.02.18
[JAVA] 슬롯 머신  (0) 2023.02.17