**어제복습**
<심심이 프로그램> 쌤코드
아무말 입력하면 txt파일의 이름들 중 랜덤으로 하나 뽑아서 출력해주기
<서버메인>
package network;
public class SMain {
public static void main(String[] args) {
AServer a = new AServer();
try {
a.con();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
<클라이언트메인>
package network;
public class CliMain {
public static void main(String[] args) {
Qclient sq = new Qclient();
try {
sq.sendMessage();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
<서버>
package network;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
public class AServer {
public void con() throws Exception {
ServerSocket ss = new ServerSocket(8282); //여긴 포트번호만 적으면 된다.
Socket sc = ss.accept(); // 연결됨?
// <클라이언트 메세지 수신>
InputStream is = sc.getInputStream();
InputStreamReader ir = new InputStreamReader(is); //byte
BufferedReader br = new BufferedReader(ir);
String message = br.readLine();
System.out.println("질문 : "+message);
// <클라이언트에게 메세지 송신>
OutputStream os = sc.getOutputStream();
OutputStreamWriter ow = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(ow);
//답 받아오기
String a = getAnswer();
bw.write(a);
bw.close();
br.close();
}
private String getAnswer(){
//디스크에 있는 파일 읽어 오기
//File f = new File("c:\\test\\woman.txt");
FileReader fi = null;
try {
fi = new FileReader("c:\\test\\woman.txt");
//file이 있을수도 있고 없을 수도 있으니 에러 > 예외처리 > try catch
BufferedReader br = new BufferedReader(fi);
String str = br.readLine();
String [] ar = str.split(",");
Random r = new Random();
int number = r.nextInt(ar.length);
return ar[number];
//while( (str=br.readLine()) != null ){}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null; // ??여긴 왜
}
}
<클라이언트>
package network;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;
public class Qclient {
public void sendMessage() throws Exception{
Socket cc = new Socket("192.168.30.58",8282); //상대 ip주소
System.out.println("질문을 입력하세요.");
Scanner sc = new Scanner(System.in);
String message = sc.next();
// <서버로 메세지 전송>
OutputStream os = cc.getOutputStream(); //byte로 처리
OutputStreamWriter ow = new OutputStreamWriter(os); //char type?
BufferedWriter bw = new BufferedWriter(ow); //String 처리
bw.write(message+"\r\n");
bw.flush(); //강제로 버퍼 비움
// <서버에서 보낸 메세지 수신>
InputStream is = cc.getInputStream();
InputStreamReader ir = new InputStreamReader(is);
BufferedReader br = new BufferedReader(ir);
String s = br.readLine();
System.out.println("질문 : " +message); //내가 보낸 메세지
System.out.println("대답 : " +s); //서버에서 보낸 메세지
br.close();
bw.close();
}
}
******************************************************************
쓰레드
프로세스와 쓰레드
프로세스 : 실행 중인 프로그램, 자원(resources)과 쓰레드로 구성
쓰레드 : 프로세스 내에서 실제 작업을 수행. 모든 프로세스는 하나 이상의 쓰레드로 구성되어 있다.
프로세스는 공장
쓰레드는 일꾼
프로세르 : 쓰레드 = 공장 : 일꾼
****************************************************************
Thread 클래스 사용
예제
<메인>
package thread;
public class TestMain {
public static void main(String[] args) {
ThreadTest t = new ThreadTest("suji");
ThreadTest t2 = new ThreadTest("iu");
t.start();
t2.start();
}
}
>
메인에서 run()이 아니라 start()메소드 실행. start() : os에게 위임
<쓰레드>
// Thread 클래스에서 상속받고
// run 메소드를 오버라이드한다.
package thread;
public class ThreadTest extends Thread {
public ThreadTest(String name) {
super(name);
}
@Override
public void run() {
for(int i=0 ; i<10 ; i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(getName()+i);
}
super.run();
}
}
***
Thread.sleep(1000); >> 1초동안 재운다. 균등하게 실행시키기 위함
***
처음엔 suji먼저 하고 iu 출력했으나 Thread 클래스 이용후 동시에 진행
(랜덤으로, 순서는 os마음)
Thread를 이용해 동시에 실행하는 것을 구현가능
*******************************************************************
주고 받는 것을 Thread로 처리해서 채팅프로그램 개선하기
Socket sc - ss,acept(); >>> 이 부분을 run() 안에 넣어서 쓰레드진행
********************************************************************
Thread 응용 : 채팅프로그램, 예매프로그램
*********************************************************************
TV 먹으면서 과자먹기 내가해본거
<메인>
package tvandeat;
public class EatTvMain {
public static void main(String[] args) {
Eat e = new Eat();
Tv t = new Tv();
e.start();
t.start();
}
}
<TV>
package tvandeat;
public class Tv extends Thread {
@Override
public void run() {
for(int i=0 ; i<10 ; i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(i+"채널시청");
}
super.run();
}
}
<과자>
package tvandeat;
public class Eat extends Thread {
@Override
public void run() {
for(int i=0 ; i<10 ; i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(i+"과자처묵처묵");
}
super.run();
}
}
***
TV보면서 과자먹기를 Runnable 인터페이스로 바꿔보자
************************************************************
Thread를 이용하는 또 다른 방법
Runnable 인터페이스 사용
Runnable 인터페이스는 run() 메서드를 구현하는 클래스를 선언
class RunTest imp
****************************************************
쓰레드의 상태 (state of thread)
-교안참고
NEW : 쓰레드가 생성되고 아직 start()가 호출되지 않은 상태
RUNNABLE : 실행 중 또는 실행 가능한 상태
BLOCKED : 동기화블럭에 의해서 일시정지된 상태(lock이 풀릴 때까지 기다리는 상태)
****************************************************
동기화 (synchronized)
방법2개
1.메소드의 동기화 : 오늘할 것
2.특정 블록의 동기화
*******************************************************
<집에오고 화장실와서 큰거하고 나가고 다음사람 들어오기>
<싱크, 쓰레드>
package house;
public class House implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"이 집에옴!");
for(int i=0 ; i<10;i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
toil();
}
}
public synchronized void toil(){
System.out.println(Thread.currentThread().getName()+"화장실 들어옴!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("응가~");
System.out.println("시원~");
System.out.println("화장실에서 나감!");
}
}
<메인>
package house;
public class HouseMain {
public static void main(String[] args) {
House h = new House();
Thread t = new Thread(h,"suji");
Thread t2 = new Thread(h, "iu");
Thread t3 = new Thread(h, "나");
t.start();
t2.start();
t3.start();
}
}
결과
>
iu이 집에옴!
나이 집에옴!
suji이 집에옴!
iu화장실 들어옴!
응가~
시원~
화장실에서 나감!
나화장실 들어옴!
응가~
시원~
화장실에서 나감!
***
만약에 synchronized를 안 걸면 동시에 들어옴
******************************************************************
자바기본 끝
언급 안된 것
1.내부 클래스 (클래스 안의 클래스)
2.GUI
****************************************************************