5. 학생 이름과 학점이 저장된 텍스트 파일을 미리 마련해두고, 서버는 이 파일을 읽는다. 그리고 클라이언트로부터 학생 이름을 입력받으면 학점을 전송하는 통신 프로그램을 작성하라. 여러 클라이언트가 서버에 접속할 수 있도록 하라.
서버
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();
}
}
6.서버의 관리자는 서버 프로그램의 화면에서 영한사전의 데이터를 저장할 수 있고, 클라이언트는 서버에 영어 단어를 보내 한글 단어를 검색할 수 있다.
서버
import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class sixServer extends JFrame{
private JTextArea ja=new JTextArea(8,20);
private HashMap<String,String> h=new HashMap<String,String>();
private Socket socket=null;
private ServerSocket listener=null;
private JTextField jt1=new JTextField(8);
private JTextField jt2=new JTextField(8);
private JButton btn;
public sixServer() {
setTitle("Dic Server");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c=getContentPane();
c.setLayout(new FlowLayout());
JPanel jp1=new JPanel();
jp1.setLayout(new FlowLayout());
jp1.add(new JLabel("영어"));
jp1.add(jt1);
jp1.add(new JLabel("한글"));
jp1.add(jt2);
btn=new JButton("저장");
c.add(jp1);
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ja.append("삽입 ("+jt1.getText()+","+jt2.getText()+")\n");
h.put(jt1.getText(), jt2.getText());
}
});
c.add(btn);
ja.setBorder(BorderFactory.createLineBorder(Color.black,1));
c.add(ja);
setSize(300,300);
setLocation(880,420);
setVisible(true);
try {
listener=new ServerSocket(9999);
while(true) {
socket=listener.accept();
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("오류 발생");
}
}
}
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();
ja.append("검색 ("+inputMessage+")\n");
if(h.containsKey(inputMessage)) {
out.write(h.get(inputMessage)+"\n");
out.flush();
}
else {
out.write("없음\n");
out.flush();
}
}
}catch(IOException e) {System.out.println(e.getMessage());}
}
}
public static void main(String[]args) {
new sixServer();
}
}
클라이언트
import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class sixClient extends JFrame{
private JTextField jt1=new JTextField(8);
private JTextField jt2=new JTextField(8);
private Socket socket=null;
public sixClient() {
setLayout(new FlowLayout());
add(new JLabel("영어"));
add(jt1);
add(new JLabel("한글"));
add(jt2);
JButton btn=new JButton("찾기");
add(btn);
try {
socket=new Socket("localhost",9999);
}catch(IOException e) {
System.out.println(e.getMessage());}
btn.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(jt1.getText()+"\n");
out.flush();
String result=in.readLine();
jt2.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 sixClient();
}
}
8. 문제 7의 프로그램을 스윙을 이용하여 재작성하라. 서버를 먼저 실행시키고, 클라이언트에서 '이미지 선택' 버튼을 누르면 JFileChooser를 이용하여 사용자로부터 이미지 파일을 선택받는다. 그리고 '파일 전송' 버튼을 누르면 이미지 파일을 서버로 전송한다. 서버는 받은 이미지를 화면에 출력한다.
매우 어려움
서버
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
class eightServer extends JFrame{
private Socket socket=null;
private ServerSocket listener=null;
private JTextArea ja=new JTextArea();
private JLabel imageLabel=new JLabel();
private File file;
public eightServer() {
setTitle("파일 받는 서버");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c=getContentPane();
c.setLayout(new BorderLayout());
ja.setBorder(BorderFactory.createLineBorder(Color.black,1));
c.add(ja,BorderLayout.NORTH);
c.add(imageLabel,BorderLayout.CENTER);
setSize(300,300);
setLocation(880,420);
setVisible(true);
try {
listener=new ServerSocket(9999);
while(true) {
socket=listener.accept();
ja.append("연결됨\n");
rcvProgram pro =new rcvProgram(socket);
pro.start();
}
}catch(IOException e) {
System.out.println(e.getMessage());
}finally {
try {
socket.close();
listener.close();
}catch(IOException e) {
System.out.println("오류 발생");
}
}
}
class rcvProgram extends Thread{
Socket socket;
public rcvProgram(Socket socket) {
this.socket=socket;
}
public void run(){
try {
BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String name=in.readLine();
file=new File("copy_"+name);
ja.append("전송받을 파일 이름 길이: "+name.getBytes().length+"\n");
ja.append("전송받은 파일 이름: "+name+"\n");
ja.append("저장할 파일 이름: "+file.getName()+"\n");
}
catch(IOException e){System.out.println(e.getMessage());}
try {
DataInputStream dis=new DataInputStream(socket.getInputStream());
FileOutputStream fo=new FileOutputStream(file);
while(true) {
byte[]buffer=new byte[1024];
while(true) {
int n=dis.read(buffer);
fo.write(buffer,0,n);
if(n<buffer.length)
break;
}
ja.append("전송받은 파일 크기:"+file.length()+"\n.............................................................................\n");
ja.append("파일 수신 성공. 현재 폴더에 저장되었습니다\n");
ImageIcon icon=new ImageIcon(file.getName());
imageLabel.setIcon(icon);
pack();
dis.close();
fo.close();
}}
catch(IOException e) {System.out.println(e.getMessage());}}}
public static void main(String[]args) {
new eightServer();
}
}
클라이언트
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.Socket;
public class eightClient extends JFrame{
private static final int DEFAULT_BUFFER_SIZE = 10000;
private JButton btn1,btn2;
private JTextField jt=new JTextField(25);
private Socket socket=null;
private String filePath;
private String fileName;
public eightClient() {
setLayout(new FlowLayout());
add(jt);
btn1=new JButton("이미지 선택");
btn1.addActionListener(new OpenActionListener());
btn2=new JButton("파일 전송");
add(btn1);
add(btn2);
btn2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
sendFile(filePath);
}
});
try {
socket=new Socket("localhost",9999);
}catch(IOException e) {
System.out.println(e.getMessage());}
setTitle("파일 전송 클라이언트");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocation(1080,420);
setSize(400,150);
setVisible(true);
}
public void sendFile(String filePath){
File file=new File(filePath);
try {
BufferedWriter out=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
out.write(fileName+"\n");
out.flush();}catch(IOException e) {System.out.println(e.getMessage());}
try {
FileInputStream fi=new FileInputStream(file);
DataOutputStream dos=new DataOutputStream(socket.getOutputStream());
byte[]buffer=new byte[1024];
while(true) {
int n=fi.read(buffer);
dos.write(buffer,0,n);
dos.flush();
if(n<buffer.length)
break;
}
// out.close();
fi.close();
dos.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
class OpenActionListener implements ActionListener{
private JFileChooser chooser;
public OpenActionListener() {
chooser=new JFileChooser();
chooser.setCurrentDirectory(new File("C:\\Users\\orang\\eclipse-workspace\\15장"));
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
FileNameExtensionFilter filter=new FileNameExtensionFilter("JPG & GIF & PNG Images","jpg","gif","png");
chooser.setFileFilter(filter);
int ret=chooser.showOpenDialog(null);
if(ret !=JFileChooser.APPROVE_OPTION) {JOptionPane.showMessageDialog(null, "파일을 선택하지 않았습니다","경고",JOptionPane.WARNING_MESSAGE);
return;}
fileName=chooser.getSelectedFile().getName();
jt.setText(fileName);
filePath=chooser.getSelectedFile().getPath();
}
}
public static void main(String[]args) {
new eightClient();
}
}
'JAVA > 공부' 카테고리의 다른 글
14. 고급 스윙 컴포넌트 (0) | 2021.02.15 |
---|---|
13. 스레드와 멀티태스킹 (0) | 2021.02.03 |
12. 그래픽 (0) | 2021.01.28 |
11. 기본적인 스윙 컴포넌트와 활용 (0) | 2021.01.23 |
10. 자바의 이벤트 처리 (0) | 2021.01.19 |