본문 바로가기

IT&코딩/국비지원

네트워크 - 2 (네트워크)

728x90
반응형

■ main args[]

 

package day08_4_mainarg;

public class MainArg {

	public static void main(String[] args) {
		
		/*
		 *  java -version ==> java.exe -version(명령행인자) (java.exe에 마이너스 버전을 포함시켜 실행시킨 것)
		 *  
		 *   main(String[] args)
		 *   
		 *   args[0] args[1]
		 *   
		 *   30 80이 명령행 인자로 들어올 때 두수의 합 110을 출력하는 프로그램을 작성하시오
		 */
		
		if(args.length != 2) {
			System.out.println("정신 똑바로!");
			System.out.println("사용법은 명령어 다음에 숫자 2개를 넣어야 합니다.");
			return;
			// c: exit(1) // java : System.exit(1) // c# : Environment.Exit() 
		}
		System.out.println(Integer.parseInt(args[0]) + Integer.parseInt(args[1]));
	}
}

 

도수창 사용을 위한 main함수의 인자 args[] 사용 방법

 

■ 네트워크 - 1

 

package review.jav;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class Network1 {

	public static void main(String[] args) throws UnknownHostException {
		
		InetAddress inet1 = InetAddress.getLocalHost();
		// InetAddress : IP 주소 표현시 사용하는 내장 클래스
		// static 클래스에 한해서 객체 안 말들고 [클래스이름].메소드() 사용가능.
		
		System.out.println(inet1.getHostAddress());
		// 192.168.0.25 ==> ipv4
		// dotted decimal address
		
		System.out.println(inet1.getHostName()); // 컴퓨터 이름
		
		// 네이버의 실제 주소를 알아보자
		InetAddress inet2 = InetAddress.getByName("www.naver.com");
		System.out.println(inet2);
		
		InetAddress [] inet3 = InetAddress.getAllByName("www.naver.com");
		for(int i=0; i<inet3.length; i++) {
			System.out.println(inet3[i]);
		}
		
		// 배열
		// www.naver.com/223.130.200.107
		// www.naver.com/223.130.195.200
		
		String s1 = "LOVE";
		System.out.println(s1.substring(1, 2)); // 첫 번째는 0123 두 번째는 1234
		
	}

}

 

■ 네트워크 - 2

 

package review.jav;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class Network2 {

	public static void main(String[] args) throws UnknownHostException {
		
		InetAddress [] inetBae = InetAddress.getAllByName("www.naver.com");
		
		for(int i=0; i<inetBae.length; i++) {
			
			System.out.println(inetBae[i]); // 둘 다
			System.out.println(inetBae[i].getHostAddress()); // 주소 only
			System.out.println(inetBae[i].getHostName()); // 이름 olny
			
			/*
			 * www.naver.com/223.130.200.104
			 * 223.130.200.104
			 * www.naver.com
			 * www.naver.com/223.130.200.107
			 * 223.130.200.107
			 * www.naver.com
			 * */
			
			InetAddress inet1 = InetAddress.getLocalHost();
			
			System.out.println(inet1.getAddress()); 
			// 결과값 해시코드 => toString() 없이 출력하면 주소가 나옴
			
			// -128 ~ 127 (0 ~ 255)
			byte[] byte4 = inet1.getAddress(); // 192.168.0.25 => 192 168 0 25
			
			for(int i1=0; i1<byte4.length; i1++) {
				System.out.println((int)byte4[i1] + "\t");
			}
			
			System.out.println(); // line-skip
			
//	 		-64 -88 0 25	=> 
			// 원래  192 168 0 25
			// 원래 0~255까지 256개를 포함할 수 있다. 
			// 우리의 목적은 -64를 192로
			// 그러므로 -64 + 256  => 192가 되므로 
			// 음수인지 물어봐서 음수면 256을 더 하고 아니면 그대로
			
			String change1 = ""; // 192에 .이 붙고 이어서 168 붙고 다시 . 붙고
			
			for(int i2=0; i2<byte4.length; i2++) {
				if(byte4[i2] < i2)
					change1 = change1 + ("" + (byte4[i2] + 256));
												// -64 + 256 = 192 // 문자 : 숫자 = 문자
				else
					change1 = change1 + ("" + byte4[i2]);
				if(i2 != 3) // i가 3이라는 것은 .이 4번째 찍힐 차례라는 것
					change1 = change1 + ".";
			}
			System.out.println(change1);
		}
	}

}

 

■ 네트워크 - 3

 

package review.jav;

public class Network3 {

	public static void main(String[] args) {
		
		String irum = "온달";
		
		byte[] byteBae = new byte[1024]; // 1byte씩 총 1KB
		
		// 문자열을 바이트배열로
		byteBae = irum.getBytes();
		
		// 바이트 배열을 문자열로
		
		String irum2 = new String(byteBae);
		System.out.println(irum2);

	}

}

 

■ 파일 - 1

 

package review.jav;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

//text viewer
		//  ==> 자바의 파일처리
		// multi user system vs stand alone
		
		
		// 메모장 파일 => read => 화면에 출력
		// open
		//  |
		// read (to 메모리)
		//  |		
		// 화면에 출력 (메모리 ==> 화면으로)
		//  |
		// close 
		
		// file의 stream 두 가지 (file => 메모리, 메모리 => file) 
		// stream : 입력하고 출력할 때 어떻게 들어오고 나가느냐를 정해놓은 것 
		
		// 1. byte stream : 10010001000010, 그림이나 음악 복사할 때 
		// 2. 문자 stream(2바이트)
		// (참고) ascil
		
		// (참고) 바이트 스트림
		// 파일에 저장시 정수의 경우 4바이트가 확보되고 10111 같은 이진수로 자료가 들어간다.
		// 바이트 스트림 : input, output이 붙는 대부분                     
		// 문자 스트림 : reader, writer이 붙는 대부분

public class FileEX {

	public static void main(String[] args) throws IOException {
		
		// UTF-8 : 한글, 일어, 중어 3바이트 처리 영어는 1바이트, 1919 문자 2바이트
		
		// 파일의 끝 : eof(end of file)
		// 한 줄의 끝 : null
		// 한글자씩의 끝 : -1
		
		// open 
		
		FileReader fr = new FileReader("c:/aaa/aaa.txt");
		BufferedReader br = new BufferedReader(fr); // 파레트와 같은 역할, 미리 적당한 양을 꺼내놓고 대기.
		
		String s;
								// 객체.메소드
		while((s = br.readLine()) != null) {
			System.out.println(s);
		}
		
		// fr은 시작위치를 가지고 있다.
		// txt 파일을 메모리에 꺼내고, 메모리에 있는 내용을 출력한다.
	}

}

 

■ 파일 - 2

 

// (1) 지난번에 만든 것(B_File)은 text view
// (2) 지금은 키보드로 읽어서 파일에 수록 = text write

 

package review.jav;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;

public class File_2 {

	public static void main(String[] args) throws IOException {
		// (1) 지난번에 만든 것(B_File)은 text view
		// (2) 지금은 키보드로 읽어서 파일에 수록 = text write
		
		// InputStreamReader is1 = new InputStreamReader(System.in);
		// BufferedReader br1 = new BufferedReader(is1);
		// 그러므로 키보드 입력은 다음이다.
		
		BufferedReader br1 = 
				new BufferedReader(new InputStreamReader(System.in));
		
		// 파일에다 자료를 수록한다.
		FileWriter fw = new FileWriter("c:/aaa/aaa.txt");
		BufferedWriter bw1 = new BufferedWriter(fw);
		PrintWriter pw = new PrintWriter(bw1, true); // true : append의 기능
		
		String s1 = null;
		
		while((s1 = br1.readLine()) != null) {
			System.out.println(s1);
			pw.println(s1);
			// 끝내고 싶으면 ctrl + z
		}
		br1.close();
		pw.close();
		

	}

}

 


 

■ Tcp - 1

 

통신
편지 vs 전화
TCP는 전화와 똑같다. 신뢰성이 있는 건 TCP, 그냥 뿌리는 건 UDP(편지)

echo program : 모든 채팅 프로그램의 시작
socket

 

□ Tcp Server

 

/*
 * 
 * client/server system ==> 인터넷과 연결돼서 확장된 게 web 
 * 
 * socket : 규칙 
 * 소켓 설명은 노트참고
 * */

 

package review.jav;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {

	public static void main(String[] args) throws NumberFormatException, IOException {
		
		// socketing program
		
		// ServerSocket은 서버쪽에서 가지고 있는 소켓
		// Socket은 클라이언트 
		// ServerSocket ss1 =  new ServerSocket(7789);
		
		ServerSocket ss1 = new ServerSocket(Integer.parseInt(args[0])); // port for listen (ip address, port no.) 7789 포트에서 준비
		// ip address 는 client 쪽에서
		System.out.println("지금 전화는 준비되어 있다.");
		
		while(true) { // listen
			System.out.println("전화 기다리는 중");
			Socket s1 = ss1.accept();
			
			// echo program
			// 통로 (= network stream)
			// ㄴ 말을 보내는 통로를 만든다. (Writer)
			// (참고)로 keyboard 입력은 다음이다.
			
			// BufferedReader br1 = 
			//		new BufferedReader(new InputStreamReader(System.in));
			
			BufferedWriter bw1 =
					new BufferedWriter(new OutputStreamWriter(s1.getOutputStream()));
			
			bw1.write("잘 지내고 있는감");
			bw1.newLine(); // 줄바꿈 
			bw1.flush(); // network stream을 비움
			System.out.println("뚝-");
			bw1.close(); s1.close();
		}
	}

}

 

□ TcpClient

 

package review.jav;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

public class TcpClient {

	public static void main(String[] args) throws IOException, UnknownHostException {
		// socket programing
		//"127.0.0.1"
		
		Socket s1 = new Socket(args[0], Integer.parseInt(args[1])); // connect
		
		BufferedReader br1 =
				new BufferedReader(new InputStreamReader(s1.getInputStream()));
		
		System.out.println(br1.readLine() + "이라고 했나? 응 잘 지내~"); // 읽어들이기
		
		br1.close();
		s1.close();
		
		System.out.println("전화끊어짐");
	}

}

 


 

■ Tcp - 2 (에코 프로그램)

 

□ TcpServer

 

package review.jav;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {

	public static void main(String[] args) throws IOException {
	
		// socketing program
		
		// byte stream 사진 등을 전송할 때는 바이트 스트림!
		
		ServerSocket ss1 = new ServerSocket(7123); // your ip, port
		
		// listen // accept
		
		Socket s1 = ss1.accept();
		
		// 바이트 or 문자스트림
		
		// network stream (원통이 2개, 자료를 주는 쪽, 받는 쪽)
		// ㄴ 클라이언트, 서버에 각각 2개씩의 in-out stream을 만든다.
		
		InputStream is1 = s1.getInputStream(); // s1과 연결하겠다는 뜻
		OutputStream os1 = s1.getOutputStream();
		
		int b1;
		
		while(true) {
			b1 = is1.read(); // 입력된 것을 읽기(꺼내기)
			if(b1 == -1)
				break;
			os1.write(b1); // 1byte 보내기
		}
		// 한줄처리의 eof = null;
		// 한글자씩 처리의 eof = -1
	}

}

 

□ TcpClient

 

package review.jav;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class TcpClient {

	public static void main(String[] args) throws UnknownHostException, IOException {
		
		// socketing program
		// 지금 프로그램이 echo program
		
		Scanner sc2 = new Scanner(System.in);
		
		Socket s = new Socket("127.0.0.1", 7123); // connect
		
		// network stream
		// 문자스트림
		
		BufferedReader br1 =
				new BufferedReader(new InputStreamReader(s.getInputStream())); // 온 것 꺼낼 때
		
		BufferedWriter bw1 = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())) ; // 서버로 보낼 때
		
		while(true) {
			System.out.print("글자 넣어봐 : ");
			String bada = sc2.nextLine();
			
			if(bada.length() == 0)
				break;
			
			bw1.write(bada, 0, bada.length());
			
			bw1.newLine();
			bw1.flush(); // buffer 비움
			// 지금까지 ondal 같은 글자를 서버로 보낸 것임
			// 그러므로 echo를 위해 여기에서 받아야 함
			// 서버에서는 한글자씩 전송하지만 나는 문자스트림
			
			String bada2 = br1.readLine(); // 서버에서 보낸 ondal 글자가 bada2로 들어감
			System.out.println("서버로부터 다시 왔다는 ~ " + bada2);
		}
		s.close();
	}

}

 


 

■ Tcp - 3

 

□ DataStream

 

package review.jav;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class DataStream {

	public static void main(String[] args) throws IOException {
		// file 처리하기
		// 파일에다 문자 및 숫자를 출력저장 해보자 그리고 꺼내서 보자
		
		FileOutputStream fos1 = new FileOutputStream("c:/aaa/aaa.txt"); // 바이트
		DataOutputStream dos1 = new DataOutputStream(fos1); // 도우미
		
		dos1.writeInt(20); // aaa에 4바이트 확보 2진수로 입력..
		dos1.writeDouble(5.78); // 8바이트를 잡은 다음에 
		dos1.writeChar('산');
		dos1.writeBoolean(false);
		dos1.writeUTF("라떼 is horse");
		dos1.close();
		fos1.close();
		//    @퇡?육  ?쇰뼹 is horse 2진수 형식이기 때문에. 다음과 같이 나와있다.
		
		// 파일에서 열기
		
		FileInputStream fis1 = new FileInputStream("c:/aaa/aaa.txt");
		DataInputStream dis1 = new DataInputStream(fis1);
		
		System.out.println(dis1.readInt());
		System.out.println(dis1.readDouble());
		System.out.println(dis1.readChar());
		System.out.println(dis1.readBoolean());
		System.out.println(dis1.readUTF());
		
		dis1.close();
		fis1.close();
	}

}

 

□ TcpServer

 

package review.jav;

import java.io.DataOutputStream;
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
		// DataInput-Output Stream 사용하기 
		
		ServerSocket ss1 = new ServerSocket(7781);
		System.out.println("전화는 준비되어 있음..");
		
		while(true) {
			System.out.println("전화 기다리는 중");
			Socket s1 = ss1.accept(); // accept
			System.out.println(s1.getInetAddress() + "에서 전화왔구먼");
			
			DataOutputStream dos1 = // network stream
					new DataOutputStream(s1.getOutputStream());
			
			dos1.writeUTF("야 오랜만이다!");
			dos1.close();
			s1.close();
		}

	}

}

 

□ TcpClient

 

package review.jav;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class TcpClient {

	public static void main(String[] args) throws UnknownHostException, IOException {
		
		Socket s1 = new Socket("127.0.0.1", 7781); // connect
		
		DataInputStream dis1 = 
				new DataInputStream(s1.getInputStream());
		
		System.out.println("네 말대로" + dis1.readUTF());
		
		dis1.close();
		s1.close();
		System.out.println("전화 끊어짐");
		
	}

}

 


 

■ Tcp - 4 (파일 전송)

 

□ File_Image

 

package review.jav;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class FileImage {

	public static void main(String[] args) throws IOException {
		// image file 처리하지
		// file 처리
		// open
		// read-write
		// close
		
		// 이미지 파일 open - 다른 이미지 파일에 save
		
		File file1 = new File("c:/aaa/aaa.jpg"); // 파일을 open
		
		// open한 파일을 이미지 버퍼에 넣자
		
		BufferedImage buffImage1 = ImageIO.read(file1); // 클래스.스태틱메소드()
		
		File file2 = new File("c:/aaa/aaa2.jpg"); // open (적기 위해)
		ImageIO.write(buffImage1, "jpg", file2);
		
		File file3 = new File("c:/aaa/aaa3.gif"); // open (적기 위해)
		ImageIO.write(buffImage1, "gif", file3);
		
		File file4 = new File("c:/aaa/aaa4.png"); // open (적기 위해)
		ImageIO.write(buffImage1, "png", file4);
		

	}

}

 

□ TcpServer

 

package review.jav;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import javax.imageio.ImageIO;

public class TcpServer {

	public static void main(String[] args) throws IOException {
		
		// socketing program(File)
		
		ServerSocket ss1 = new ServerSocket(7783);
		System.out.println("서버 준비되어 있음");	
		
		
		while(true) {
			
			System.out.println("기다리는 중");
			Socket s1 = ss1.accept();
			System.out.println(s1.getInetAddress() + "에서 접속");
			// ---------------------------------------
			// from 서버 to 클라이언트로 이미지 파일을 전송할 경우
			// ---------------------------------------
			
			File file1 = new File("c:/aaa/bbb.jpg");
			BufferedImage buffImage1 = ImageIO.read(file1);
			ImageIO.write(buffImage1, "jpg", s1.getOutputStream());
			
			s1.close();
			System.out.println("jpg 전송 완료!");
			
		}
	}

}

 

□ TcpClient

 

package review.jav;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.imageio.ImageIO;

public class TcpClient {

	public static void main(String[] args) throws UnknownHostException, IOException {
		
		Socket s1 = new Socket("127.0.0.1", 7783);
		// 서버에서 보낸 이미지를 받아서 파일로 저장한다.
		// 서버에서 bbb.jpg 전송하고 클라이언트에는 ccc.png로 저장
		
		BufferedImage buffimage1 = ImageIO.read(s1.getInputStream());
		// byte stream
		
		File file1 = new File("c:/aaa/ccc.png"); // 이 파일에 png로 저장
		
		ImageIO.write(buffimage1, "png", file1);
		// 넘어온 이미지를 ccc.png 이름으로 저장
		// 물론 jpg로 맞추면 jpg로 저장된다.
		
		System.out.println("png로 저장됨");
		s1.close();
		System.out.println("끝");
	}	

}

 


 

■ Tcp - 5 (문서 옮기기)

 

□ TcpServer

 

package review.jav;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
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 
		ServerSocket ss1 = new ServerSocket(37791);
		System.out.println("서버 준비되어 있음");
		
		while(true) {
			System.out.println("기다리는 중..");
			Socket s1 = ss1.accept();
			System.out.println(s1.getInetAddress() + "에서 접속");
			
			// .xlsx, .hwp 등 
			
			File file1 = new File("c:/aaa/aaa.docx");
			FileInputStream fis1 = new FileInputStream(file1);
			DataInputStream dis1 = new DataInputStream(fis1);
			// aaa.docx를 읽어서 (1024 바이트씩)
			
			DataOutputStream dos1 = new DataOutputStream(s1.getOutputStream());
			
			int len = 1024;
			byte[] byteBae = new byte[len];
			
			// dis1.read(); -> 1바이트
			// dis1.read(1024) -> 1024 바이트를 읽음
			
			int chk = 0;
			
			// 문서에서 1024 바이트를 읽었는데 값이 있으면 클라이언트로 전송.
			// 읽을 값이 없으면 -1이 반환형이 되므로
			// -1이 반환될 때 while을 벗어난다.
			
			while((chk = dis1.read(byteBae, 0, byteBae.length)) != -1) {
				// c:/aaa/aaa.docx 파일에서 0번째부터 시작해서 1024바이트를 읽어서
				// byte 배열에 넣는다.
				
				dos1.write(byteBae); // 1024 바이트 글자가 서버에서 클라이언트로 전송
			}
			
			dos1.flush(); dis1.close(); dos1.close(); s1.close();
			System.out.println("전송완료");
			
			
		}
	}

}

 

□ TcpClient

 

package review.jav;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class TcpClient {

	public static void main(String[] args) throws UnknownHostException, IOException {
		
		Socket s1 = new Socket("127.0.0.1", 37791);
		
		// c:/aaa/bbb.docx 파일에 전송받은 파일을 저장
		
		// File file1 = new File("c:/aaa/bbb.docx");
		// FileOutputStream fis1 = new FileOutputStream(file1);
		
		FileOutputStream fos1 = new FileOutputStream("c:/aaa/bbb.docx"); // (2) 여기에 저장
		DataInputStream dis1 = new DataInputStream(s1.getInputStream()); // (1) 전송된 것을 여기서 꺼내
		
		byte[] byteBae = new byte[1024];
		
		int chk = 0;
		
		while((chk = dis1.read(byteBae)) != -1) {
			fos1.write(byteBae); //writeInt, 2진수
		}
		
		fos1.close(); dis1.close(); s1.close();
		System.out.println("끝~");
	}

}

 


 

■ Tcp - 6 (readFully)

 

□ TcpServer

 

package day09_5_full;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
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 
				
		ServerSocket ss1 = new ServerSocket(37799);
				System.out.println("서버 준비되어 있음");	
				
				while(true) {
					
					System.out.println("기다리는 중...");
					Socket s1 = ss1.accept();
					System.out.println(s1.getInetAddress() + "에서 접속");
					
					// -------------------------
					File file1 = new File("c:/aaa/ccc.jpg");
					FileInputStream fis1 = new FileInputStream(file1);
					DataInputStream dis1 = new DataInputStream(fis1);
					// (1)ccc.jpg를 읽어서
					
					DataOutputStream dos1 = new DataOutputStream(s1.getOutputStream());
					// (2)클라이언트로 전송하려고 
					
					
					byte[] byteBae = new byte[(int)file1.length()]; // ccc.jpg의 크기만큼 배열 잡음.
					
					dis1.readFully(byteBae); // 파일이 전부 배열로 
					// 그런 다음 클라이언트로 보낼 때 
					// (1) 먼저 길이를 보내고 //(2) 내용을 전송 
					dos1.writeInt(byteBae.length);
					dos1.write(byteBae); // 내용을 전송(서버에서 클라이언트로 전송됨)
					System.out.println("전송했다는~");
				} // while-true end
		}

}

 

□ TcpClient

 

package day09_5_full;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class TcpClient {

	public static void main(String[] args) throws UnknownHostException, IOException, NegativeArraySizeException {
		
		// socketing program
		
		Socket s1 = new Socket("127.0.0.1", 37799);
		FileOutputStream fos1 = new FileOutputStream("c:/aaa/ccc7.jpg");
		// (2) 여기에 저장
		DataInputStream dis1 = new DataInputStream(s1.getInputStream());
		// (1) 전송된 것을 여기서 꺼내
		
		int len1 = dis1.readInt(); // 서버에서 writeInt()로 보낸 파일길이 읽기
		
		byte [] byteBae2 = new byte[len1];
		
		dis1.readFully(byteBae2); // 전체 파일 내용을 다 읽어서 byteBae2 배열로 넣자
		
		// 바이트 배열 내용을 파일에 출력 저장
		
		fos1.write(byteBae2);
		System.out.println("끝~");
	
	}
}

 

■ Tcp - 7 (일대일채팅)

 

□ TcpClient

 

package chat1vs1;

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 {

		// socketing 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
		// rcv/ send 시작
		// 그러므로 Thread가 필요
		// client/server를 연결할 수 있는 network stream이 있으므로
		// 이미 만들어 놓은 것을 사용하자
		// 단, 객체 이름은 다르게 하자
		// 서버쪽 thread 4줄 복붙하고 객체명 변경
		ThreadSend tsc1 = new ThreadSend(s1);
		ThreadRcv trc1 = new ThreadRcv(s1);
		tsc1.start(); // thread의 run()을 찾아감
		trc1.start();

		// 현재 같은 패키지 안에 4개의 .java 가 있으므로
		// 컴파일되면 4개의 클래스가 생긴다.

	}
}

 

□ TcpServer

 

package chat1vs1;

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); // 강제종료

		}

		// ServerSocket ss1 = new ServerSocket(7878);
		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/rcv thread)

			// 두가지 방식중 하나를 선택해서 작성
			// 두가지란? extends Thread, implements 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

 

□ ThreadRcv

 

package chat1vs1;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;

public class ThreadRcv extends Thread {
	
	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) {
				// e.printStackTrace();
			}

		} // while-end

	} // run-end

} // ThreadRcv class-end

 

□ ThreadSend

 

package chat1vs1;

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;

//public class ThreadSend { //단순클래스이므로 

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) {
				// TODO Auto-generated catch block
				// e.printStackTrace();
			}

		} // while-end
	}// run-end
}// ThreadSend class-end

 

728x90
반응형

'IT&코딩 > 국비지원' 카테고리의 다른 글

SQL - 2  (0) 2023.04.13
SQL - 1  (0) 2023.04.13
네트워크 - 1 (네트워크 이론 및 스레드)  (0) 2023.03.22
Java - 2  (0) 2023.03.22
Java - 1  (0) 2023.03.20