728x90
반응형
■ 일대일 채팅
□ TcpServer
package day09_6_onetoone;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
// 일대일 채팅
public class TcpServer {
public static void main(String[] args) throws IOException {
// socketing program
if(args.length != 1) { // 포트번호가 안 들어왔으면
System.out.println("사용법은 java 패키지명.파일명 포트번호");
System.exit(1); // 강제종료 (0은 정상종료)
}
ServerSocket ss1 = new ServerSocket(Integer.parseInt(args[0]));
System.out.println("서버 잘 준비됨 . . . . . . . . . . . ");
while(true) {
System.out.println("미팅 대화 기다리는 중");
Socket s1 = ss1.accept(); // connect를 허락
// client / server 서로 연결 되었으므로 대화 시작
// 여기서 thread 2개가 요구된다. (send thread / receive thread)
// 두 가지 방식 중 하나 선택해서 작성
// 1. extends Thread, 2. implement Runnable
// thread 클래스 이름이 ThreadSend , ThreadRcv 라고 가정하고
// 객체를 작성해보자
// 엑박이 뜨면 마우스 갖다대고 클릭하면 별도 클래스, 생성자 등을 자동생성한다.
ThreadSend ts1 = new ThreadSend(s1);
ThreadRcv tr1 = new ThreadRcv(s1);
// class가 별도 자바로 만들어져 있더라도 같은 패키지 안에 있으면 하나의 자바로 처리한다.
// 즉, 나누어진 클래스나 하나의 /java 안에 있는 여러개의 클래스나 같은 것임
ts1.start(); // thread의 run()을 찾아간다.
tr1.start();
}
} // main-end
} // class-end
□ TcpClient
package day09_6_onetoone;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class TcpClient {
public static void main(String[] args)
throws NumberFormatException, UnknownHostException, IOException {
// skocketing program
if(args.length != 2) { // ip address와 포트번호가 안 들어왔으면
System.out.println("사용법은 java 패키지명.파일명 ip-address 포트번호");
System.exit(1); // 강제종료
}
Socket s1 = new Socket(args[0], Integer.parseInt(args[1]));
// connect
// receive / send 시작
// 그러므로 Thread가 필요
// client / server를 연결할 수 있는 network stream이 있으므로
// 이미 만들어 놓은 것 사용하자
// 단, 객체이름은 다르게 하자
// 서버쪽 thread 2줄 복붙하고 객체명 변경
ThreadSend tsc1 = new ThreadSend(s1);
ThreadRcv trc1 = new ThreadRcv(s1);
tsc1.start();
trc1.start();
// 현재 같은 패키지 안에 4개의 .java가 있으므로
// 컴파일되면 4개의 클래스가 생긴다.
// TcpServer.class, TcpClient.class, ThreadSend.class, ThreadRcv.class
} // main-end
} // class-end
□ ThreadRcv
package day09_6_onetoone;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
public class ThreadRcv extends Thread {
// String what1; x ===> send 쪽에서 이미 접두어를 붙이므로 여기서는 안 만듦.
Socket s1;
DataInputStream dis1;
//String what1; x =======> send쪽에서 이미 접두어를 붙이므로
// 여기서는 안 만든다
public ThreadRcv(Socket s1) throws IOException {
this.s1 = s1;
dis1 = new DataInputStream(s1.getInputStream());
} // 생성자-end
public void run() { // chat 받는 부분을 처리
// dos1.writeUTF(what1 + sc1.nextLine());를 받으면 된다.
// ㄴ 미팅중 ==> I Love You
while(dis1 != null) {
try {
System.out.println(dis1.readUTF());
} catch (IOException e) {
}
} // while-end
} // run-end
} // class-end
□ ThreadSend
package day09_6_onetoone;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
public class ThreadSend extends Thread { // 단순클래스이므로
Socket s1; // 속성, 필드
DataOutputStream dos1;
String what1;
public ThreadSend(Socket s1) throws IOException { // 생성자 // 시작하자마자 뭔가를 실행시키고 싶으면 생성자한테 맡기자.
this.s1 = s1;
// 네트워크 스트림 작성
dos1 = new DataOutputStream(s1.getOutputStream());
what1 = "미팅중 ==> ";
} // 생성자-end
public void run() {
// 화면에 chat을 입력받아서 상대방에게 send
Scanner sc1 = new Scanner(System.in);
while(dos1 != null) { // chat이 있으면
try {
dos1.writeUTF(what1 + sc1.nextLine()); // 미팅중 ==> I Love You
} catch (IOException e) {
}
} // while-end
} // run-end
} // class-end
728x90
반응형
'IT&코딩 > 국비지원' 카테고리의 다른 글
| HTML - 1 (웹이론) (0) | 2023.05.03 |
|---|---|
| SQL - 4 (JOIN) (0) | 2023.04.18 |
| SQL - 3 (0) | 2023.04.13 |
| SQL - 2 (0) | 2023.04.13 |
| SQL - 1 (0) | 2023.04.13 |