■ 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