2008년 11월 17일
2학기 10주차_1
오늘의 힌트. 그래픽스 객체를 가져올때는 setVisible 이후에 와야한다.
○멀티쓰레드.
지금까지는 싱글쓰레드의 프로그램을 설계해왔다. 음.. 말하자면.. 단반향통신 이었는데.
이제 다중방향 통신을 한다고 생각하면 되겟다. ㅋㅋㅋㅋ
뭐..;; 난 통신과니까.
아무튼 쓰레드는 두가지 방법이 있다.
java.lang.Thread 클래스를 상속하는 방법
java.lang.Runnable 인터페이스를 구현하는 방법
이 두가지 방법인데..;;
상황에 맞게 상속하는걸 쓸것이냐 인터페이스 구현을 하느냐 하는 그정도 차이가 되겠다.
결국에는 리스너와 어댑터 정도의 차이인가 ㅡㅡㅋ
파고들면 아니긴 하지만 ㅋ
상속받는 경우에 Thread 클래스를 상속받은 클래스 에서는 run 메소드를 오버라이딩해서
정의한다. 그러면,,;;
run 메소드는 쓰레드가 실행될때 자동으로 실행이 된다. 흠.. ㅋㅋㅋ
예제문.
public class Study1112_1 {
public static void main(String args[]){
Thread thread = new ThreadExam();
thread.start();
for(int i =0 ; i <10 ; i++){
try{
Thread.sleep(1000);
}catch(Exception e){}
System.out.println("현재수:"+i);
}
}
}
class ThreadExam extends Thread{
public void run(){
for (int i = 100; i < 110 ; i++){
try{
Thread.sleep(1000);
}catch(Exception e){}
System.out.println("현재수:"+i);
}
}
}
그냥.. 간단히 맛보기라고 할수 있겟다. 흠..;; ㅋㅋㅋ
Thread를 또 다른 클래스에서 상속받으면..;; 3중 숫자세기도 가능은 하다.
런어블을 구현해서 하는 멀티쓰레드는 그 클래스의 객체를 만들고
그 객체를 쓰레드 객체에 인수로 넣어 사용한다. 무슨말인지 이해가 잘안되겠지만..;;
ThreadExam1 th = new ThreadExam1();
Thread thread1 = new Thread(th);
Thread thread2 = new ThreadExam2();
thread1.start();
thread2.start();
이런 식이다.
runnable을 구현한 클래스 객체 생성
-> 다시 쓰레드객체생성
-> 쓰레드객체에 runnable을 구현한 클래스객체를 인수로 넣기
-> 객체명.start();
흠..
멀티쓰레드는 엄밀히 말해서 병렬적으로 진행이 되는것이기 때문에
어떤 한개의 목표를 두고 두개의 쓰레드가 경쟁을 할경우
둘다 목표를 취하는 경우등의 레이즈 상황이 발생하는데
이것을 주의하여 프로그래밍 해야겟다.
○네트워크프로그래밍
InetAddress 클래스
-특이한점이 객체를 생성할때 생성자를 호출하는게 아니라, 클래스내의 스태틱메소드를
호출하여 생성한다.
○소켓
getInputStream 하면 어떻게 읽어들이는가?
-ServerSocket 클래스
서버 프로그램에서만 사용하고 포트를 열고 연결 요청이 오기를 기다린다.
연결요청이 오면? 거기에 맞는 클라이언트 소켓을 생성하여 반환한다.
생성자는 다음과 같다.
ServerSocket(int port)
port에 연결된 서버 소켓 생성. port는 1-65535 사이의 값 중에서 다른 프로그램이 사용하지 않는 값을 이용해야 한다.
ServerSocket(int port, int backlog)
port에 연결된 서버 소켓 생성. backlog값은 동시에 연결대기 상태(SYN_RECVED)에 있을 수 있는 최대 수.
두개의 사용법중 아래는 별로 쓰지 않지만 위는 기본으로 알고 가야한다!!
메서드는 다음과 같다.
Socket accept() TCP 연결요청을 기다리다가 요청이 들어오면 소켓을 만들어 연결하고 그 소켓을 반환한다.
void close() ServerSocket을 닫고 사용되고 있는 모든 리소스를 해제한다.
서버프로그램은 서버소켓을 이용하여 포트를 열고 기다리고 클라이언트는 서버소켓으로 요청을 하고
서버소켓은 요청을 받으면 다른 소켓을 만들어 그 클라이언트와 연결하여 통신이 되도록 만든다.

이걸이용해서 간단하게 문자가 왓다갓다 하는 프로그램은..;;
흠...
import java.net.*;
import java.io.*;
class Client{
private Socket csocket;
public Client(String add, int port){
try{
csocket = new Socket(add,port);
}catch(IOException e){
System.out.println("예외처리:"+e.getMessage());
}
}
public void Connection(){
try{
BufferedReader in = new BufferedReader(new
InputStreamReader(csocket.getInputStream()));
PrintWriter out = new PrintWriter(csocket.getOutputStream(),true);
BufferedReader reader = new BufferedReader(
new InputStreamReader(System.in));
while(true){
String str = reader.readLine();
if(str.equals("bye")) break;
out.println(str);
}
csocket.close();
} catch(IOException e){
System.out.println("IOException: "+e.getMessage());
}
}
}
public class Study1116_4 {
public static void main(String args[]){
String add="203.237.163.177";
int port=8088;
if (args.length>0){
add = args[0];
port = Integer.parseInt(args[1]);
}
Client c =new Client(add,port);
c.Connection();
}
}
=====================================
import java.net.*;
import java.io.*;
class TCPserver {
private int port;
private ServerSocket servSocket;
private Socket clntSocket;
public TCPserver(int port){
this.port = port;
}
public void listen(){
try{
servSocket = new ServerSocket(port);
clntSocket = servSocket.accept();
}catch(IOException e){
System.out.println("예외검출:"+e.getMessage());
}
}
public void Connection(){
try{
BufferedReader in = new BufferedReader
(new InputStreamReader(clntSocket.getInputStream()));
PrintWriter out = new PrintWriter(clntSocket.getOutputStream(),true);
while(true){
String str = in.readLine();
if(str == null ) break;
System.out.println("클라이언트: "+str);
}
clntSocket.close();
}catch(IOException e){
System.out.println("예외검출:"+e.getMessage());
}
}
}
public class Study1116_3{
public static void main(String args[]){
int port = 8088;
if (args.length > 0){
port = Integer.parseInt(args[0]);
}
TCPserver sv = new TCPserver(port);
sv.listen();
sv.Connection();
}
}
대충 이렇게 해서 돌리면 문자가 왓다갓다하는 프로그램이 된다.
아니지 ㅡㅡㅋ
클라이언트에서만 되는거지 ㅡㅡㅋ ㅋ클라이언트가 하는말이
서버에 보이는거지 ㅋㅋㅋㅋ 아..;;
이거는 내가 구현할 프로젝트에서도 쓰이기 때문에 유용하다.
보면..;; 리슨에서 소켓을 만들고
커넥션에서 일을처리한다.
클라이언트는 보내고 서버는 화면에 뿌려주는.. ㅋㅋㅋㅋ
굉장히 단순하기 때문에
복잡할것이 없다.
서버나 클라이언트나 크게 다를건 없다.
단지 자바프로그래밍에 네트워크 분야가 나오니 좀 신선한듯..; ㅋㅋㅋ
채팅프로그램도 해야하는데..;;
꼭해봐야 하는데..;;
서버와 클라언트 부분을 이용해서 각부분을
서로 상호연동하겟금해주면..;;
쌍방향 통신도 어렵지 않을듯하다..; 실시간으로 통신을 하려면..;;
쓰레드를 이용해야 겠지?
자기가 입력 받는 차례라고 남이 입력하는거 안보이면 안되니까 ㅋㅋㅋ
흠..;;
분야는 점점 넓어지고.
안타깝네 ㅋㅋㅋ
열심히 공부하지 않으면..
안되겠어~ ㅋㅋ
이 글과 관련있는 글을 자동검색한 결과입니다 [?]
- 자바 10주차 첫번째 일기 by 파브레가스
- MultiCounter~~~ by element
- 실습 과제 풀이. by 만성피로
- 08.11.12 (11주차) 네트웍프로그래밍 by 장유진
- 객체지향언어 실습 중간고사 정리 by 레이야
# by | 2008/11/17 11:08 | 트랙백 | 덧글(1)





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]