Processing 에서는 아주 쉽게 이더넷 통신을 할 수 있습니다.
Server 클래스의 주요 메소드
번호메소드처리 개요1234567
active () | Server 소켓을 사용할 수 있는지 검사합니다 |
available () | Server 측에서 수신 할 데이터가 있는지 검사합니다 |
disconnect () | 연결된 클라이언트 소켓을 절단합니다 |
stop () | 소켓을 절단합니다 |
write () | 데이터를 전송합니다 |
serverEvent () | 연결 이벤트를 처리합니다 |
disconnectEvent () | 절단 이벤트를 처리합니다 |
import processing.net.* 을 포함 시켜야 합니다.
1. 서버설정
Server myServer = new Server (PApplet applet, int port);
Server myServer = new Server (PApplet applet, int port, String secondHost);
applet : PApplet 인스턴스. 일반적으로 this를 제공
port : 연결을 받아들이는 포트 번호
secondHost : 여러 개의 NIC를 탑재하는 경우 다른 호스트 이름 또는 IP 주소를 제공
클라이언트 요청을 기달리는 포트번호를 지정하여 서버측 소켓을 생성한다.
8000번 포트에서 대기하는 서버소켓 생성 코드 예
import processing.net.*;
void setup(){
//서버소켓을 생성하는
//로컬호스트 8000번 포트 대기
Server myServer = new Server(this, 8000 );
if( myServer.active() == false ){
println("생성실패");
exit();
}
}
void draw(){
background(200);
}
2. 소켓 유효성 확인
유효성을 확인하는boolean alive = myServer.active ();
alive : 유효한 경우 True
myServer : Server 인스턴스
서버 소켓을 사용 (생성 된)이면 True를 리턴 합니다.
3. 수신 가능한 소켓의 유무를 검사한다.
수신 가능한 소켓의 유무를 검사하는Client conClient = myServer.available ();
conClient : 수신 가능한 데이터가있는 Client 인스턴스
myServer : Server 인스턴스
수신 가능한 소켓이 있는지 확인한다. 없으면 null 이, 있으면 해당 클라이언트 인스턴스(실제 메모리를 사용하는 객체) 가 리턴 됨
서버소켓 생성 후 수신 가능한 소켓이 있는지 확인하면서 읽기 처리하는 소스 예
import processing.net.*;
Server myServer;
void setup(){
myServer = new Server(this, 5204 );
if( myServer.active() == false ){
println("작성실패");
exit();
}
}
void draw(){
//수신가능한 소켓이 있는지 알어
Client conClient = myServer.available();
if( conClient != null ){
println("수신가능한 소켓이 있습니다.");
int recvSize = conClient.available();
if ( recvSize > 0) {
//수신
byte[] recvData = conClient.readBytes( recvSize );
println("받았습니다. :" + recvData.length );
}
}
}
수신처리 코드 다른 예
String incomingMessage = "";
void draw(){
Client client = server.available();
if (client!= null) {
// 수신데이터가 있으면
incomingMessage = client.readString(); // 문자열로 읽음
incomingMessage = incomingMessage.trim(); // \n, 공백문자 제거
println( "Client says:" + incomingMessage); // 콘솔에 수신데이터 표시
// 클라이언트에 데이터 전송
server.write( "How does " + incomingMessage + " make you feel?\n" ); // A reply is sent using write().
}
serverEvent 함수는 새 클라이언트가 연결될 때마다 호출됩니다
void serverEvent(Server server, Client client) {
incomingMessage = "A new client has connected: " + client.ip();
println(incomingMessage); // 클라이언트 IP 출력
}
4. 보내기
보내는void myServer.write (byte [] sendData);
sendData : 전송 데이터
myServer : Server 인스턴스
연결된 클라이언트 소켓에 데이터를 전송한다. 해당서버에 연결된 모든클라이언트에 데이터 전송한다.(주의사항)
특정클라이언트 에만 데이터를 전송할때는 serverEvent() 등으로 연결해온 클라이언트 소켓(번호)을 취득하고 해당 클라이언트에
대해 write()를 보낼수 있다.
프로그램 예
myServer.write("song");
void draw(){
}
void mouseClicked(){
//데이터를 전송하는
byte[] sendData = new byte[256];
myServer.write( sendData );
}
5. 소켓절단
소켓을 절단하는void myServer.stop ();
myServer : Server 인스턴스
대기 소켓을 닫습니다. 종료... 소켓을 닫으면 다시 소켓을 생성 할 때까지 소켓에서 대기할 수 없습니다
소켓을 절단하면 닫으면 콘솔에 "Server SocketException:socket closed" 가 표시 됩니다.
5. 연결 이벤트 처리
연결 이벤트를 처리void serverEvent (Server evtServer, Client conClient) {}
evtServer : 이벤트가 발생한 서버 소켓
conClient : 이벤트가 발생한 클라이언트 소켓
클라이언트 측에서 연결이 발생한 경우 serverEvent 함수가 호출 됨
// 연결을 감지 했을때 호출되는 이벤트 함수
void serverEvent(Server evtServer, Client conClient ){
println( conClient.ip() + "연결되었습니다.");
// Data 전송 됨
byte[] sendData = new byte[256];
conClient.write( sendData );
}
6. 절단 이벤트 처리
절단 이벤트를 처리void disconnectEvent (Client disClient) {}
disClient : 이벤트가 발생한 클라이언트 소켓
연결된 클라이언트 소켓이 파기된 경우 disconnectEvebt 함수 가 호출된다.
절단을 감지 했을때 호출되는 이벤트 함수
void disconnectEvent(Client disClient) {
println( disClient.ip() + " 가 종료 되었습니다");
}
// 이미지 전송 서버용 샘플 프로그램
/*
PROCESSING 3.0 Server/Client Sample
*/
import processing.net.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
Server myServer;
PImage sendImage;
byte[] sendData;
void setup(){
size( 300,300 );
textSize( 32 );
textAlign(LEFT,TOP);
fill(255,255,0);
myServer = new Server(this, 5204 ); // 로컬 호스트 포트
if( myServer.active() == false ){
println("연결실패");
exit();
}
// wjsthdeotkd dlalwl fhem
sendImage = loadImage("smg.png");
Path file = Paths.get( dataPath( "smg.png" ) );
try{
sendData = Files.readAllBytes( file );
} catch( IOException e ){
e.printStackTrace();
}
}
void draw(){
background( sendImage );
text( "Server", 0, 0 );
}
// 클라이언트에 이미지 데이터 쓰기
void serverEvent(Server someServer, Client conClient) {
println( "연결로 데이터 전송:" + sendData.length );
conClient.write( sendData );
}
수신 클라이언트 프로그램
import processing.net.*;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.ByteArrayInputStream;
import java.awt.Image;
Client myClient;
PImage recvImage;
boolean recvFlg;
void setup(){
size( 300,300 );
textSize( 32 );
textAlign(LEFT,TOP);
fill(0,0,255);
//클라이언트 소켓을 생성하는
//로컬 호스트 5204번 포트가 기다리고 있는 상태
myClient = new Client(this,"127.0.0.1", 5204 );
//미 수신하기
recvFlg = false;
}
void draw(){
background(200);
//미 수신이라면 수신 데이터 확인
//수신된 경우 표시
if( recvFlg == false ){
//미 수신
recvCheckAndConvertImage();
} else {
//수신 됨
recvImage.resize( width, height );
image( recvImage, 0, 0 );
text( "Client", 0, 0 );
}
}
//수신 데이터가 있는지 검사하고 데이터를 이미지로 변환
void recvCheckAndConvertImage(){
int readBytes = myClient.available();
if( readBytes > 0 ){
//수신 데이터가 있는 경우
byte[] recvData = myClient.readBytes( readBytes );
//수신 데이터를 이미지로 변환
try{
BufferedImage bImg = ImageIO.read(new ByteArrayInputStream(recvData));
Image img = (Image)bImg;
recvImage = new PImage(img);
recvFlg = true;
}catch( Exception e ){
e.printStackTrace();
}
}
}