본문 바로가기

IT&코딩/국비지원

네트워크 - 3

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