반응형
package net.echo;
import java.io.BufferedReader;
import java.io.IOError;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class EchoServer {
public static void main(String[] args) {
try {
//1234번 port를 사용하는 Server생성
ServerSocket server = new ServerSocket(1234);
System. out.println( "Server starting...." );
while( true){
//Client의 연결요청이 접수되면 Socket 생성하기
System. out.println( "waithing for connection....");
Socket socket = server.accept();
String clientIp = socket .getInetAddress().getHostAddress();
System. out.println( "connected client.["+ clientIp+ "].");
OutputStream os = socket .getOutputStream();//1byte씩가능하나
InputStream is = socket .getInputStream();//나도 1byte씩 가능하지만~
BufferedReader in = new BufferedReader( new InputStreamReader(is ));//한줄씩 읽어 버퍼드리더 껴서 읽으니 한줄씩읽어버렷
PrintWriter out = new PrintWriter( os, true); //os 에 PrintWriter를 끼웠어 성능 좋아짐.
//클라이언트가 보낸 메세지 읽기
String message = in.readLine();
System. out.println( "client message:" + message);
out.println( "멀웃어~" );
}
//
} catch (IOException e) {
System. out.println( e.getMessage());
System. out.println( "서버를 시작할 수 없습니다." );
}
}
}
package net.echo;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
public class EchoClient {
public static void main(String[] args) {
try {
//서버로 메세지 보내기
Socket socket = new Socket( "192.168.0.5", 1234);
System. out.println( "connected server." );
OutputStream os = socket.getOutputStream();
InputStream is = socket.getInputStream();
PrintWriter out = new PrintWriter( os, true); //text쓰기에 좋음
BufferedReader in = new BufferedReader( new InputStreamReader(is ));//text를 읽기에 좋음
out.println( "^^");
//서버가 보낸 메세지 읽기<-- 서버가 메세지를 다 보낼때까지 대기한다.
String message = in.readLine(); //줄바꿈을 자동으로 한다.
System. out.println( "Server response message:" + message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
프로토콜 정의
업무구분:매장번호:???
판매정보 저장
업무구분:매장번호:상품번호:판매수량
SELL:S_001:100:3
가격 조회
업무구분:매장번호:상품번호
GET :S_001 :200
업무구분:상품번호:상품가격
GET :200 :15000
매출조회
업무구분:매장번호
PROFIT :S_001
클라이언트
1. 서버와 통신하기 위한 소켓 생성
2. 메세지 송/수신을 위한 스트림 연결
3. 전송버튼 클릭하면
입력된 메세지를 서버로 보낸다.
서버로부터 받은 메세지를 화면에 표시한다.
만약 서버와 연결이 끊어져서 예외가 발생하면 소켓을 닫는다.
서버
1. 클라이언트의 연결을 기다리는 서버소켓 생성
2. 반복
클라이언트 연결요청이 오면, 그놈이랑 통신을 담당하는 소켓을 생성
각각의 클라이언트와 동시에 메세지 송수신을 해야되기 때문에 스레드를 생성
(스레드에는 송/수신 기능이 구현되어 있음 <-- 그래서 소켓이 필요함)
서버 스레드
package net.protocol;
import java.awt.EventQueue;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class StoreMgr {
private JFrame frame;
private JTextField inputbox;
Socket socket = null;
PrintWriter out = null;
BufferedReader in = null;
/**
* Launch the application.
*/
public static void main(String[] args) {
StoreMgr window = new StoreMgr();
window. frame.setVisible( true);
}
/**
* Create the application.
*/
public StoreMgr() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 417, 270);
frame.setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE );
frame.getContentPane().setLayout( null);
JLabel lblNewLabel = new JLabel( "\uC785\uB825");
lblNewLabel.setBounds(12, 40, 57, 15);
frame.getContentPane().add( lblNewLabel);
JLabel label = new JLabel( "\uCC98\uB9AC\uACB0\uACFC" );
label.setBounds(12, 78, 57, 15);
frame.getContentPane().add( label);
inputbox = new JTextField();
inputbox.setBounds(85, 37, 193, 21);
frame.getContentPane().add( inputbox);
inputbox.setColumns(10);
JButton btn = new JButton( "\uC804\uC1A1");
btn.setBounds(292, 36, 97, 23);
frame.getContentPane().add( btn);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(81, 78, 308, 144);
frame.getContentPane().add( scrollPane);
JTextArea textArea = new JTextArea();
scrollPane.setViewportView( textArea);
frame.getContentPane().add( btn);
try{
//서버와 통신할 소켓을 생성
socket = new Socket( "192.168.0.5", 3333);
//textdata를 주고받기 위한 스트링 만들기
out = new PrintWriter( socket.getOutputStream(), true);
in = new BufferedReader( new InputStreamReader(socket .getInputStream()));
JOptionPane. showMessageDialog( null, "서버와 연결 성공!");
} catch(Exception e){
JOptionPane. showMessageDialog( null, "서버와 연결할 수 없습니다.");
System. exit(0);
}
//전송버튼을 클릭하면 입력된 정보를 서버로 전송한다 서버로부터 받은 결과 메세지를 textarea에 표시한다.
btn.addActionListener( e->{
//jtextfield 에 입력된 값 가져오기
String data = inputbox.getText();
out.println( data);
try{
//서버로 데이타 전송
out.println( data);
//서버에서 클라이언트로 보낸 메세지 읽기 서버에서 응답이 오면실행됨
String responseMessage = in.readLine();
//메세지를 jtextarea에 표시
int length = textArea.getText().length();
textArea.setCaretPosition( length);
textArea.append( "처리결과 = " + responseMessage + "\n" );
} catch(IOException ex){
System. out.println( ex.getMessage());
JOptionPane. showMessageDialog( null, "서버와의 연결이 끊어졌습니다.");
try{ socket.close();} catch(Exception ex2){}
}
});
}
}
package net.protocol;
import java.net.ServerSocket;
import java.net.Socket;
public class StoreServer {
public static void main(String[] args) throws Exception {
//서버소켓을 생성한다.
ServerSocket server = new ServerSocket(3333);
System. out.println( "서버가 시작되었습니다." );
while ( true) {
System. out.println( "클라이언트의 연결요청을 기다리는 중....");
Socket socket = server.accept();
//클라이언트의 ip의 조회한다.
String ip = socket.getInetAddress().getHostAddress();
System. out.println( "["+ ip+ "]연결되었습니다." );
//하나의서버는 여러클라이언트와 통신을 해야하므로 쓰레드
//각각의 소켓과 연결된 클라이언트와 메세지 송수신을 전달하는 스래드 만들기 <-- 통신에 필요한 Socket을 전해준다.
StoreServerThread t = new StoreServerThread(socket );
t.start();
}
}
}
package net.protocol;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class StoreServerThread extends Thread {
// 클라이언트와 통신하기 위한 소켓을 담을 변수
// 서버에서 만든 소켓을 전달 받을꺼임
private Socket socket;
public StoreServerThread(Socket socket) {
this. socket = socket;
}
// 스레드를 사용해서 동시에 하고 싶은 일을 구현한곳.
// 클라이언트와 메시지 주고 받을래
public void run() {
BufferedReader in = null;
PrintWriter out = null;
// text data 송/수신을 위한 스트림 연결
try {
in = new BufferedReader( new InputStreamReader(
socket.getInputStream()));
out = new PrintWriter( socket.getOutputStream(), true);
} catch (Exception e) {
}
try {
// 클라이언트와 메세지 송/수신 받기
while ( true) {
// 클라이언트의 요청을 처리하는 코드 / 클라이언트가 보낸 메세지 읽기
String data = in.readLine();
String[] arr = data.split( ":");
// 메세지 처리하기
String job = arr[0];
if ( "SELL".equals( job)) {
sell( arr, out);
} else if ( "GET".equals( job)) {
get( arr, out);
} else {
etc( out);
}
}
} catch (Exception e) {
try {
socket.close();
} catch (Exception ex) {
}
}
}
// 상품판매 처리하기
public void sell(String[] arr, PrintWriter out) throws Exception {
//클라이언트의 메세지 처리
if ( arr. length == 4) {
String storeNo = arr[1];
String productNo = arr[2];
String qty = arr[3];
System. out.printf( "대리점[%s], 상품번호[%s], 수량[%s]\n", storeNo,
productNo, qty);
//처리결과를 클라이언트로 전달
out.println( "RESULT:SELL:SUCESS" );
} else {
out.println( "RESULT:SELL:FAIL" );
}
}
// 가격 조회 처리하기
public void get(String[] arr, PrintWriter out) throws Exception {
if ( arr. length == 3) {
String storeNo = arr[1];
String productNo = arr[2];
System. out.printf( "대리점[%s], 상품번호[%s]\n" , storeNo, productNo);
int price = Integer. parseInt( productNo) * 1000;
out.println( "RESULT:GET:" + productNo + ":" + price);
}
}
// 기타 처리
public void etc(PrintWriter out) throws Exception {
out.println( "RESULT:INVALID_MESSAGE" );
}
}
TCP : 연결지향 data를 여러조각으로 쪼개서 전송 중간에 하나라도 잘못되면 다시 보내달라고 요청(전화) 소켓을 이용 통신
UDP : 보내기만 함 서버에서는 데이타를 받는다 심각한 오류가 아닌이상 재전송 요구를 하지 않는다.(편지, 동영상 재생할때 사용) 데이타그램이란것을 사용
매쉬업 : 기존에 존재하는 서비스를 융합해서 새로운 서비스를 만들어내는것
package xml;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
public class UrlDemo {
public static void main (String[] args ) throws Exception {
//http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.xml?key=430156241533f1d058c603178cc3ca0e&targetDt=20150431
//http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=430156241533f1d058c603178cc3ca0e&targetDt=20150431
String str = "http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.xml?key=430156241533f1d058c603178cc3ca0e&targetDt=20150431" ;
URL url = new URL( str);
InputStream is = url.openStream();
FileOutputStream fos = new FileOutputStream("c:/java_study/movie.xml" );
int value = 0;
while (( value= is.read()) != -1) {
fos.write( value);
}
fos.close();
is.close();
}
}
xml파일이나 txt파일으로 떨굴수 있다.
반응형