애플릿에서 소켙연결...


[ 다음 글들 ] [ 이어서 글올리기(답하기) ] [ 자바 묻고 답하기 ]

글쓴이 :그니 2000년 5월 31일 18:26:06

애플릿에서 제가 임의로 만든 객체를 채팅프로그램 처럼
소켙을 열어 오고가게 할 수 있는지 궁금해서 문의 드립니다..


애플릿과 서버간에 문자열은 잘 오가는데..오가야할 정보의 양이 많아서 객체를 만들어 애플릿 측과 서버측에 같이 만들어 놓고 소켙을 열어서 이동을 시키면
ClassNotFoundException 이 발생합니다..


애플릿에서 서버(예를 들면 채팅서버)측으로 제가만든 클래스를 오가게 할수는 없나요..에플릿-서블릿 간 통신도 해보고..안한건 코바와 RMI밖에 없는데..공부할 시간이 없는지라..문의 를 드립니다..


제가 만든 객체는 serializable 인터페이스를 implements 해서 만들었습니다..
그 안에는 단순한 String 형만 두었구요..


java api에서 제공하는 예를들면..
Date 객체는 잘 왔다갔다..하는데..제가 만든건 안되네요..


소스가 깨끗하지 않아 죄송스러운데..


//////////////////////////////
/////////////////////////////
에플릿 소스입니다..
/////////////////////////////


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;
import java.net.*;
import java.util.*;



//애플릿 클래스
public class ImgDisplay2 extends JApplet
{
static String imgfile="allapt35.gif"; //집 구조도
static String iconfile="tv2.jpg"; //전구그림

public void init()
{
Image img=getImage(getCodeBase(),imgfile);
Image icon=getImage(getCodeBase(),iconfile);


System.out.println("이미지 불러오기 성공");

ImgPanel imgpanel=new ImgPanel(img,icon);
System.out.println("allpanel created");
getContentPane().add(imgpanel);
String str="테스트입니다."; //테스트용 스트링

Home_Info mesg=new Home_Info("203.248.108.145",str);


(new HSock_Client()).connect(mesg); //client 소켙의 connect 함수 호출
}
}

class Cen_Info extends Object implements java.io.Serializable
{
String message;



public Cen_Info(String message)
{
this.message=message;
}
public String getMsg()
{
return message;
}
}


class Home_Info extends Object implements java.io.Serializable
{

String message;
String hostIP;


public Home_Info(String hostIP,String message)
{
this.message=message;
this.hostIP=hostIP;
}
public String getMsg()
{
return message;
}
public String getHostIP()
{
return hostIP;
}

}

//소켙임무를 수행하는 client
class HSock_Client implements Runnable//Cen_ResponseHandler//,Runnable
{

public HSock_Client() //생성자
{
Cen_IP="203.248.108.145";
Cen_Port=10000;
}
public HSock_Client(String IP,int Port)
{
Cen_IP=IP;
Cen_Port=Port;
}

public void connect(Home_Info mesg) //Home_Info 라는 객체를 중앙서버에 보낸다.
{
String name=mesg.getHostIP();
String message=mesg.getMsg();

System.out.println("홈서버이름:"+name+",보낼 메시지:"+message);
try
{
socket=new Socket("203.248.108.145",10000);
System.out.println("****중앙서버와 연결됨***");
System.out.println("중앙서버:"+Cen_IP+" ,Port Num:"+Cen_Port);



OutputStream os=socket.getOutputStream();//중앙 서버에 보내는 스트림 os
toServer =new ObjectOutputStream(os); //filter 스트림 toServer

System.out.println("****중앙서버로의 출력 스트림 생성***");

send(mesg); //객체를 보낸다..

InputStream is=socket.getInputStream(); //중앙 서버로부터 입력을 받는 스트림 is
fromServer=new ObjectInputStream(is); //filter 스트림 fromServer

System.out.println("****중앙서버로부터의 입력 스트림 생성***");

receiver=new Thread(this);
receiver.start();

System.out.println("***홈서버 쓰레드 호출****");
}
catch(IOException e)
{
System.out.println("***연결실패***"+e);
}
catch(NumberFormatException e)
{
System.out.println("***연결실패:포트번호가 잘못되었슴***");
}
}

public void run()
{
try
{
System.out.println("***홈서버 쓰레드 생성***");

//중앙 서버로부터의 메시지 처리 루프
while(receiver !=null)
{
Object obj=fromServer.readObject();
Cen_Info mesg=(Cen_Info)obj;
System.out.println("중앙서버로부터의 메시지:"+ mesg.getMsg() );

}
}
catch(IOException e)
{
System.out.println("***쓰레드 생성시 오류***"+e);
}
catch(ClassNotFoundException e)
{
System.out.println("***프로그램 버그:클래스 화일이 누락되었습니다.***");
}
}
//중앙서버로 객체를 보내는 함수
void send(Home_Info mesg) throws IOException //Home_Request:중앙 서버에 보내는 객체
{
toServer.writeObject(mesg);
toServer.flush();
}
//스트림과 소켙을 닫아준다.
void close()
{
try
{
fromServer.close();

System.out.println("중앙서버로부터 스트림 연결종료");

toServer.close();

System.out.println("중앙서버에로의 스트림 연결종료");


if(socket != null){
socket.close();

System.out.println("남은 소켓 종료시키기");
}
}
catch(IOException e)
{}

receiver=null;

}

//데이타 멤버변수 정의

private String Cen_IP; //Home IP Address
private int Cen_Port; //Home Server Port Number
private Socket socket; //Home client 소켓
private Thread receiver; //Home client 쓰레드객체..
private ObjectInputStream fromServer;
private ObjectOutputStream toServer;


}
//애플릿에 붙일 이미지 패널..1개만 사용
class ImgPanel extends JPanel
{
Image img=null; //집 구조도 이미지
Image icon=null; //선택할수 있는 컴포넌트 이미지
Image selectimg=null; //움직이는 선택이미지..
static int current=0; //선택된 가전의 번호
private int images=12; //컨트롤할 가전의 개수
private int evtArea =25; //이벤트를 받는 범위
private int pX; //집 구조도에 붙인 가전의 위치
private int pY;
private int fixflag=0; //fixflag 가 1이면 움직인 컴포넌트의 그림을 그리자.
//제대로 가전을 선택했는지 판단.
private int isSelect; //선택된 이미지영역을 제대로 선택했으면 1로 설정
//드래그 앤 드롭을 가능하게 한다.
private static final int SQUARELENGTH=20;

public ImgPanel(Image img,Image icon)
{
this.img=img;
this.icon=icon;

setBackground(Color.lightGray);

//마우스 리스너 등록
addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent evt)
{
int cx;//클릭위치
int cy;
cx=evt.getX();
cy=evt.getY();
//x,y위치를 파악해 드로윙 한다.
//Graphics g=getGraphics();
select(cx,cy);//맞는 아이콘을 찾자
}
public void mousePressed(MouseEvent evt)
{
if( find(evt.getX(),evt.getY()) )
isSelect=1;
else isSelect=0;

}
public void mouseReleased(MouseEvent evt)
{
pX=evt.getX();
pY=evt.getY();
if(isSelect==1)
{
current=0;
fixflag=1;
isSelect=0;
repaint();
}
}

});

}


public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.magenta);
g.drawImage(img,0,0,this);
for(int i=0;i<images/2;i++)
g.drawImage(icon,500,50+i*50,this);
for(int i=0;i<images/2;i++)
g.drawImage(icon,550,50+i*50,this);

if(current==7)
{
selectimg=icon;
g.drawImage(icon,400,200,this);//선택된 이벤트를 (400,200)에 무조건 그리자
pX=400;
pY=200;
}

//움직인 이미지에 대한 그림그리기
if(fixflag==1)
g.drawImage(selectimg,pX,pY,this);

}

//x,y 위치를 파악해 어느 이미지가 이벤트 발생했는지를 찾아서 paint함수 호출
public void select(int x,int y)
{
if(x<575&&x>550&&y<75&&y>50)
{
System.out.println("Image clicked");
current=7;
repaint();
//g.drawImage(icon,500,200,this);
}
}
public boolean find(int x,int y)//선택영역 안에 있는지 파악하는 함수
{
if( x > pX && x < pX+SQUARELENGTH && y > pY && y < pY+SQUARELENGTH )
{
System.out.println("select image selected");
return true;
}
return false;
}

}


/////////////////////////////////////
컨버터한 html 코드입니다..
/////////////////////////////////////
<html>
<body>


</body>
</html>


//////////////////////////////////////


다음 글들:



이어서 글올리기(답하기)

이름:
E-Mail:
제목:
내용:
HTML 태그 포함 여부: HTML 문서일 경우 체크
관련 URL(선택):
URL 제목(선택):
관련 이미지 URL:


[ 다음 글들 ] [ 이어서 글올리기(답하기) ] [ 자바 묻고 답하기 ]