2008년 11월 24일
2학기 11주차_1
오늘의 힌트.
네트웍 프로그램의 기본은 소켓이다.
소켓이 정의 하는것은 주소인데
이것은 IP와 포트번호가 규정이 되어야한다.
수신과 송신 파트 모두 동일한 소켓정보를 알고 있어야한다.
○실습과제.13장..
서버부분.
import java.net.*;
import java.io.*;
class Server extends Thread{
private Socket clnt;
private BufferedReader in;
private PrintWriter out;
private String str = null;
public Server(Socket clntSocket){
clnt = clntSocket;
try{
in = new BufferedReader
(new InputStreamReader(clnt.getInputStream()));
out = new PrintWriter(clnt.getOutputStream(),true);
}catch(IOException e){
System.out.println(e.getMessage());
}
}
public void run(){
try{
str = in.readLine();
System.out.println(str+"을 수신하였습니다.");
System.out.println("클라이언트로 재전송합니다.");
out.println(str);
clnt.close();
}catch(IOException e){
System.out.println(e.getMessage());
}
}
}
public class Study11122_1 {
static ServerSocket servSocket;
static Socket clntSocket;
public static void main (String args []){
try{
servSocket = new ServerSocket(9000);
System.out.println("메세지수신을 기다립니다.");
while(true){
clntSocket = servSocket.accept();
Thread sv = new Server(clntSocket);
sv.start();
}
}catch(IOException e){
System.out.println(e.getMessage());
}
}
}
클라이언트부분
import java.net.*;
import java.io.*;
public class Study1122_2 {
static Socket csocket;
public static void main(String args[]){
try{
csocket = new Socket(args[0], Integer.parseInt(args[1]));
System.out.println(args[0]+" "+args[1]+"서버에 접속하였습니다.전달할 메세지를 입력하세요.");
BufferedReader in = new BufferedReader(new
InputStreamReader(csocket.getInputStream()));
PrintWriter out = new PrintWriter(csocket.getOutputStream(),true);
BufferedReader reader = new BufferedReader(
new InputStreamReader(System.in));
String str = reader.readLine();
out.println(str);
System.out.println("서버로 메세지를 전송합니다.");
String instr = in.readLine();
System.out.println("서버가 메세지 ("+instr+") 를 잘받았습니다. ");
csocket.close();
}catch(IOException e){
System.out.println(e.getMessage());
}
}
}
쓰레드를 사용하였기때문에
클라이언트가 몇개가 됫든 서버에 물리면
서버는 접속을 허용하고. 클라이언트의 메세지를 재전송해준다.
서버부분에서 보면 소켓을 인수로 쓰레드에 전송하기때문에
쓰레드가 이루어지면 다중방향 통신이 된다는 것을 알수 있다.
1:1만이 아닌 1:다가 가능한것이다.
이런식으로 되었을때 조금만 손을보면 다중 채팅이 가능한
프로그램도 만들수 있다는것을 알수 있다.
저번에 짜본 간단한 클라이언트와 서버의 cmd 상에서의 채팅과 비슷하지만.
소켓자체를 계속생성하고 쓰레드를 이용하기 때문에
다중통신이 되도록 하는것이 중점이라 할수 있겠다.
○ 화이트보드
수업시간의 마지막 강의인 화이트 보드이다.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Study1123_3 extends Frame{
private MyCanvas mc;
private MenuPanel pane;
private Pen p;
public Study1117_3(){
super("도형그리기-화이트보드");
p = new Pen();
mc = new MyCanvas(p);
pane = new MenuPanel(p,mc);
setSize(800,600);
add(pane,"West");
add(mc,"Center");
/*Panel test = new Panel();
test.add(new Label(p.getType()+""));
add(test,"East");*/
setVisible(true);
}
public static void main (String args[]){
Study1117_3 obj = new Study1117_3();
}
}
class Pen{
private int type = 0;
public void setType(int type){
this.type = type;
}
public int getType(){
return type;
}
}
class MenuPanel extends Panel{
private Pen p;
private MyCanvas mc;
public MenuPanel(Pen p, MyCanvas mc){
super(new GridLayout(8,1));
this.p = p;
this.mc = mc;
Button b1 = new Button("사각형");
Button b2 = new Button("삼각형");
Button b3 = new Button("둥근사각형");
Button b4 = new Button("동그라미");
Button b5 = new Button("부채꼴");
Button b6 = new Button("직선");
Button b7 = new Button("지우기");
Button b8 = new Button("모두 지우기");
MenuListener ml = new MenuListener(p, mc);
b1.addActionListener(ml);
b2.addActionListener(ml);
b3.addActionListener(ml);
b4.addActionListener(ml);
b5.addActionListener(ml);
b6.addActionListener(ml);
b7.addActionListener(ml);
b8.addActionListener(ml);
add(b1);
add(b2);
add(b3);
add(b4);
add(b5);
add(b6);
add(b7);
add(b8);
}
}
class MenuListener implements ActionListener{
private Pen p;
private MyCanvas mc;
public MenuListener(Pen p, MyCanvas mc){
this.p = p;
this.mc = mc;
}
public void actionPerformed(ActionEvent e){
String str = e.getActionCommand();
if ("사각형".equals(e.getActionCommand())){
p.setType(1);
}
else if ("삼각형".equals(e.getActionCommand())){
p.setType(2);
}
else if ("둥근사각형".equals(e.getActionCommand())){
p.setType(3);
}
else if ("동그라미".equals(e.getActionCommand())){
p.setType(4);
}
else if ("부채꼴".equals(e.getActionCommand())){
p.setType(5);
}
else if ("직선".equals(e.getActionCommand())){
p.setType(6);
}
else if ("지우기".equals(e.getActionCommand())){
p.setType(7);
}
else if ("모두 지우기".equals(e.getActionCommand())){
Graphics g = mc.getGraphics();
g.clearRect(0,0,mc.getWidth(),mc.getHeight());
}
}
}
class MyCanvas extends Canvas{
private Pen p;
private int xp, yp, xr, yr;
private int lx, ly, dwid, dhei, sx, sy;
public MyCanvas(Pen p){
this.p = p;
addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
xp = e.getX();
yp = e.getY();
}
public void mouseReleased(MouseEvent e){
xr = e.getX();
yr = e.getY();
draw();
}
});
}
public void paint(Graphics g){
}
public void draw(){
Graphics g = getGraphics();
if(xp > xr){
dwid = xp - xr;
lx = xp;
sx = xr;
}
else if(xp < xr){
dwid = xr - xp;
lx = xr;
sx = xp;
}
else if(xp == xr){
dwid = 0;
lx = xp;
sx = xp;
}
if(yp > yr){
dhei = yp - yr;
ly = yp;
sy = yr;
}
else if(yp < yr){
dhei = yr - yp;
ly = yr;
sy = yp;
}
else if(yp == yr){
dhei = 0;
ly = yp;
sy = yp;
}
switch(p.getType()){
case 1:
g.drawRect(sx, sy, dwid, dhei);
break;
case 2:
int[] xpos = {sx, (xp+xr)/2, lx};
int[] ypos = {ly, sy, ly};
g.drawPolygon(xpos, ypos, 3);
break;
case 3:
g.drawRoundRect(sx,sy,dwid,dhei,5,10);
break;
case 4:
g.drawOval(sx,sy,dwid,dhei);
break;
case 5:
g.fillArc(sx,sy,lx,ly,0,160);
break;
case 6:
g.drawLine(sx,sy,lx,ly);
break;
case 7:
g.clearRect(sx,sy,lx,ly);
break;
}
}
}
조건은 간단하다. 펜클래스를 만들어 각 버튼들은 펜 객체를 이용해 어떤 버튼인지
인식하고 캔버스에 그려주면 끝.
결국에 그렇게 하고 내부클래스로 하지 않으려면..;; 펜객체가 이곳저곳 팔려다녀야한다. ㅋㅋ
메인에서 만든 펜객체를 다른곳에도 다뿌려주어야만이
다른클래스에서도 같은 펜객체를 사용하니까.
흠.. 만약 다른데서 펜객체를 만들어 사용한다면 가주 기본적인 문제가 발생한다.
바로, 메인의 펜객체와는 다른 객체라는것. ㅎㅎㅎ 후~
그리고..;;
창을 늘리거나 줄일때 또는 내렷다 올릴때 캔버스안에 있던것들이 다 사라지는데..;;
이걸 좀 해결해야 하는데..;; 여기에만 묶여있을수는 없으니까..;;
그냥 생각해보면, 페인트문에서 드로우 한번 불러오면 되지 않을까 싶지만..;; ㅋㅋㅋ
그렇게 하면 또 마지막에 그린것만 남겠지?? ㅋㅋㅋ
그런거 말고 흠 각 그릴때 정보를 배열이나 흠.. 그런거에
집어넣어놓고..;; 페인트에서 계속 불르는거지 ㅋ
아니면.. 다른 캔버스를 만들고 그 캔버스에 정보를 넘기고..;;
다시 가져오는.. 흠.. 이상하다. 휴..;;
짜면서 젤 어려운부분이..;; 각 도형에 정보를 주는건데..;;
아 힘들어서 사실 재번이 도움좀 받았다 ㅎㅎㅎ
하지만.. 나머지 부분들은 100% 내 노력인데 쩝..
나중에 시간날때 이 프로그램좀 더 발전시켜봐야겟다.
더 세련되게...
이 글과 관련있는 글을 자동검색한 결과입니다 [?]
- 08.11.12 (11주차) 네트웍프로그래밍 by 장유진
- Exam1302Server와 Client by element
- 08.11.19 (12주차) 화이트보드 by 장유진
- 네트워크 연결 by 김형준
- 11주차 첫번째 일기 by selju
# by | 2008/11/24 22:24 | 실험프로젝트2학기 | 트랙백 | 덧글(1)





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
집어넣어놓고..;; 페인트에서 계속 불르는거지 ㅋ
-> 이 아이디어가 정답입니다. 페인트로 그리는 그림들을 규정할 수 있는 클래스들을 만들어서 그릴 때마다 이들의 객체를 생성하고 이를 벡터에 저장하여 둡니다. 그리고 paint()에서는 이 벡터에 들어있는 모든 객체들을 그리게 하는 것입니다.