[Day 14]公費0414-内容整理
🌞例
🌟(EchoServer)例1🌟
package exam01;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
public class EchoServer {
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(9001);
System.out.println(" ** 서버가 가동되었습니다. **");
while(true) {
Socket socket = server.accept();
System.out.println("클라이언트가 연결하였습니다.");
System.out.println("-----------------------------------------------------");
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
byte []data= new byte[100];
while(true) {
is.read(data); //데이터를 받은 것
String msg = new String(data);
if(msg.trim().equals("q!")) {
break;
}
os.write(data); //데이터를 받은 것을 그대로 내보내는 것 ==> 메아리
System.out.println("클라이언트로 수신한 데이터: " +msg + "다시 메아리 하였습니다.");
Arrays.fill(data, (byte)0); //데이터를 비워줌.
}
System.out.println("클라이언트와 연결을 종료하였습니다.");
System.out.println("-------------------------------------------------------");
is.close();
os.close();
socket.close();
}
} catch(Exception e) {
System.out.println("예외발생: " + e.getMessage());
}
}
}
🌟(EchoClient)例2🌟
package exam01;
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 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 EchoClientGUI extends JFrame implements ActionListener {
// 대화내용을 입력할 텍스트필드를 멤버변수로 선언ㅇ
JTextField jtf;
// 서버가 메아리 한 대화내용을 계속하여 누적하여 보여주기 위한 TextArea를 멤버변수로 선언
JTextArea jta;
// 소켓을 멤버변수로 만든다.
Socket socket;
// 데이터를 주고 받을 스트림을 멤버변수로 선언
InputStream is;
OutputStream os;
public EchoClientGUI() {
try {
// 서버의 통신을 요청
socket = new Socket("192.168.35.171", 9001);
// 데이터를 주고받을 스트림을 생성
is = socket.getInputStream();
os = socket.getOutputStream();
} catch (Exception e) {
System.out.println("예외발생: " + e.getMessage());
}
// 멤버변수들을 생성
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.SOUTH);
// 프레임의 크기를 정해준다.
setSize(600, 400);
// 프레임을 화면에 보여주도록 설정
setVisible(true);
// 'X" 단추를 누르면 프로그램을 종료하도록 설정
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 서버로부터 수신되는 데이터를 계속하여 받기위한 클래스를 스레드로 구현
class ClientThread extends Thread {
// run을 오버라이딩
public void run() {
// 서버로부터 수신되는 데이터를 받기 위한 배열을 만든다.
byte[] data = new byte[100];
// 계속 실행
while (true) {
try {
// inputstream을 통해 서버로부터 수신되는 데이터를 받는다.
is.read(data);
// 수신된 데이터를 문자열로 만든다.
String reMsg = new String(data);
// 수신된 문자열의 대화내용을 누적할 텍스트에리어에 추가
jta.append(reMsg + "\n");
} catch (Exception e) {
System.out.println("예외발생: " + e.getMessage());
}
} // end while
} // end run
} // end Thread
// 서버로부터 수신되는 데이터를 계속하여 받는 클라이언트 스레드 객체를 생성
Thread t = new ClientThread();
// 스레드 가동
t.start();
}
@Override
public void actionPerformed(ActionEvent e) {
// 텍스트필드에 쓰여진 글자를 가져온다.
String msg = jtf.getText();
try {
// 출력스트림을 통해 데이터를 서버로 보낸다.
// 데이터를 보낼 때는 문자열을 바이트의 배열로 변환하여 보낸다.
os.write(msg.getBytes());
// 만약에 입력한 문자열이 q! 이면 프로그램을 종료
if (msg.equals("q!")) {
System.exit(0);
}
} catch (Exception ex) {
System.out.println("예외발생: " + ex.getMessage());
}
}
public static void main(String[] args) {
// 프레임을 생성
new EchoClientGUI();
}
}
🌞練習問題
👑練習1👑
package practice768;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Arrays;
import java.util.Scanner;
public class Practice06Client {
public static void main(String[] args) {
try {
Socket socket = new Socket("192.168.35.171", 9001);
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
Scanner sc = new Scanner(System.in);
String msg;
byte []data = new byte[100];
while (true) {
System.out.print("서버로 전송할 텍스트: ");
msg = sc.next();
os.write(msg.getBytes());
if (msg.equals("q!")) { // 메시지가 q!를 입력하면 종료
break;
}
is.read(data);
String reMsg = new String(data);
String msg_U = msg.toUpperCase(); //입력받은 문자를 모두 대문자로 바꿈 toUpperCase
System.out.println("서버로부터 전송된 텍스트: " + msg_U);
Arrays.fill(data, (byte)0); //데이터를 비워줌.
}
System.out.println("통신을 종료하였습니다.");
is.close();
os.close();
socket.close();
} catch (Exception e) {
System.out.println("예외발생: " + e.getMessage());
}
}
}
👑練習2👑
package practice768;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
import java.util.HashMap;
public class Practice06Server {
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(9001);
System.out.println("서버프로그램입니다.");
while(true) {
Socket socket = server.accept();
System.out.println("연결되었습니다.");
System.out.println("-----------------------------------------------------");
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
byte []data= new byte[100];
while(true) {
is.read(data); //데이터를 받은 것
String msg = new String(data);
System.out.println("클라이언트가 전송한 텍스트: " +msg);
String msg_U = msg.toUpperCase(); //입력받은 문자를 모두 대문자로 바꿈 toUpperCase
if(msg.trim().equals("q!")) {
break;
}
os.write(data); //데이터를 받은 것을 그대로 내보내는 것 ==> 메아리
System.out.println("클라이언트가 보낸 텍스트: " +msg_U);
Arrays.fill(data, (byte)0); //데이터를 비워줌.
}
System.out.println("클라이언트와 연결을 종료하였습니다.");
System.out.println("-------------------------------------------------------");
is.close();
os.close();
socket.close();
}
} catch(Exception e) {
System.out.println("예외발생: " + e.getMessage());
}
}
}
Reference
この問題について([Day 14]公費0414-内容整理), 我々は、より多くの情報をここで見つけました https://velog.io/@rlaehdus0417/Day-14-국비-0414-내용-정리テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol