9월, 2012의 게시물 표시

소켓 프로그래밍

아래의 소켓 서버/클라이언트 소스코드는 각각 콘솔에서 실행되며, 클라이언트로부터 한 줄을 입력 받아 서버에서 해당 내용을 출력하고, 다시 그 내용을 클라이언트에 보내면, 클라이언트가 받은 메시지를 출력한다. 테스트를 위해 로컬 호스트 주소를 사용하고 있으며, 포트번호는 11111을 사용했다. 다중 클라이언트에 응답하는 서버를 만드려면 스레드로 처리해야 한다.

소켓 클라이언트소켓을 연다.소켓에 대해 입출력 스트림을 연다.서버의 프로토콜에 맞게 입출력 스트림에서 읽거나 쓴다.스트림을 닫는다.소켓을 닫는다. 1 public staticvoidmain(String[] args)throws IOException { 2 // 소켓을 연다. 3 Socket socket =newSocket(InetAddress.getLocalHost(),11111); 4 5 // 입출력스트림을 연다. 6 PrintWriter out =newPrintWriter(socket.getOutputStream(), true); 7 BufferedReader in=newBufferedReader(newInputStreamReader( socket.getInputStream())); 8 9 // 콘솔에서 입력받는다.10 BufferedReader stdIn =newBufferedReader(newInputStreamReader(System.in));11 String userInput;12 13 while((userInput = stdIn.readLine()) != null) {14 // 입력받은 내용을 소켓에 쓴다.15 out.println(userInput);16 // 소켓의 응답을 읽어서 출력한다.17 System.out.println("echo: "+in.readLine());18 }19 20 // 닫는다.21 out.close();22 in.close();23 stdIn.close();24 …

java.net.URLConnection

URL url =newURL(""); URLConnection conn = url.openConnection(); conn.setDoInput(true);//GET//conn.setDoOutput(true) //POST InputStreamReader isr =newInputStreamReader(conn.getInputStream());

java.net.Socket

InetAddress addr = InetAddress.getByName("www.xxx.com"); Socket socket =newSocket(addr,80); String request ="GET http://www.xxx.com/index.html HTTP1/0\r\n\n";
OutputStreamWriter osw =newOutputStreamWriter(socket.getOutputStream());//출력
InputStreamReader isw =newInputStreamReader(socket.getInputStream());//입력

java.net.ServerSocket

Server 1 ServerSocket serverSocket =newServerSocket(1234); 2 while(true) { 3 Socket socket = serverSocket.accept(); 4 InputStreamReader isr =newInputStreamReader(socket.getInputStream()); 5 BufferedReader br =newBufferedReader(isr,512); 6 String data = br.readLine(); 7 br.close(); 8 }

Client 1 InetAddress addr = InetAddress.getByName("..."); 2 Socket socket =newSocket(addr,1234); 3 OutputStreamWriter osw =newOutputStreamWriter(socket.getOutputStream()); 4 BufferedWriter bw =newBufferedWriter(osw,512); 5 PrintWriter pw =newPrintWriter(bw); 6 pw.println("Hello"); 7 pw.flush(); 8 pw.close();

java.net.InetAddress

static InetAddress getLocalHost()
static InetAddress getByName(String host)
static InetAddress[] getAllByName(String host)

HTTP POST

Java를 사용한 POST 방식 데이터 전송 및 응답 처리하기 1 public staticvoidmain(String[] args) { 2 try{ 3 //연결 4 URL url =newURL("http://www.example.com/post.php"); 5 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 6 conn.setDoOutput(true); 7 conn.setRequestMethod("POST"); 8 conn.setRequestProperty("Accept-Language","ko-kr,ko;q=0.8,en-us;q=0.5,en;q=0.3"); 9 10 //데이터11 String param = URLEncoder.encode("name","UTF-8") +"="+ URLEncoder.encode("??","UTF-8");12 param +="&"+ URLEncoder.encode("age","UTF-8") +"="+ URLEncoder.encode("??","UTF-8");13 14 //전송15 OutputStreamWriter osw =newOutputStreamWriter(conn.getOutputStream());16 osw.write(param);17 osw.flush();18 19 //응답20 BufferedReader br = null;21 br =newBufferedReader(newInputStreamReader(conn.getInputStream(),"UTF-8"));22 String line = null;23 while(…

java.util.Date

생성자
Date() 현재 시간

Date(long date)

메서드
boolean after(Date when)
boolean before(Date when)
long getTime()
void setTime(long time)

java.text.SimpleDateFormat

1 Date date =newDate(); 2 SimpleDateFormat f =newSimpleDateFormat("yyyy-MM-dd HH:mm:ss); 3 String str = f.format(date);

문자열의 길이 계산

paint()메서드 안에서 문자열을 그릴 때, 해당 문자열의 크기를 얻어오는 방법.
1 Graphics2D g = (Graphics2D) graphics; 2 3 g.drawString(str, x, y); 4 5 int width = g.getFontMetrics().stringWidth(str); 6 int height = g.getFontMetrics().getHeight(); 7 8 g.dispose();

Swing Launcher

main() 함수에서 다음과 같은 방식으로 JFrame등을 실행시킬 수 있다.

1 SwingUtilities.invokeLater(newRunnable(){ 2 publicvoidrun() { 3 JFrame win =newJFrame(); 4 win.pack(); 5 win.setVisible(true); 6 } 7 });

OSX에서의 Swing

자바로 구현된 스윙 어플리케이션을 맥 OSX에서 구동하는 경우, 시스템 룩앤필을 적용하는 것만으로는 뭔가 아쉽다는 것을 깨달았다. 윈도우즈나 리눅스와 달리 OSX에서는 메뉴바가 화면 위에 있다거나 해서 좀 더 손 봐줘야 할 곳이 있다. 아래 링크된 사이트의 몇 가지 항목을 번역해 두기로 한다.

http://www.devdaily.com/apple/mac/java-mac-native-look/

https://developer.apple.com/library/mac/#documentation/Java/Conceptual/Java14Development/04-JavaUIToolkits/JavaUIToolkits.html#//apple_ref/doc/uid/TP40001901-SW1

시스템이 OSX인지를 판별String lcOSName = System.getProperty("os.name").toLowerCase();boolean IS_MAC = lcOSName.startsWith("mac os x");

시스템 룩앤필을 적용UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

메뉴바를 화면 맨 위로 이동System.setProperty("apple.laf.useScreenMenuBar","true");

메뉴바에 패키지명 대신 어플리케이션 이름을 지정System.setProperty("com.apple.mrj.application.apple.menu.about.name","어플리케이션명");


독 바 아이콘을 지정하려한다거나 보다 자세한 내용이 필요한 경우에는 원문을 참조하기 바란다.

Jar 패키지 안의 파일을 이용하기

이미지 파일 혹은 텍스트 파일을 Jar 패키지 안에 포함시켜 놓고 소스 코드에서 해당 파일에 접근해서 읽는 방법이다.  해당 경로에 필요한 파일을 복사해 두는 것을 잊지 말것!

이미지 파일 1 URL urlImage =getClass().getResource("kr/pe/elex/images/imageFile.png"); 2 myImage = Toolkit.getDefaultToolkit().getImage(urlImage); 3 //혹은 4 //myImage = ImageIO.read(urlImage);
텍스트 파일 1 JarFile jarFile =newJarFile(getClass().getProtectionDomain().getCodeSource().getLocation().toURI()); 2 JarEntry entry = jarFile.getJarEntry("kr/pe/elex/files/textFile.txt"); 3 InputStreamReader input =newInputStreamReader(jarFile.getInputStream(entry) );

스윙에서 데스크탑의 브라우저 실행하기

버튼 등에서 이벤트를 받아서 임의의 URL로 이동하는 브라우저를 띄우려거든 리스너에 다음과 같이 구현한다.
1 publicvoidactionPerformed(ActionEvent e) { 2 try{ 3 Desktop.getDesktop().browse(new java.net.URI("www.elex.pe.kr")); 4 }catch(IOException e1) { 5 e1.printStackTrace(); 6 }catch(URISyntaxException e1) { 7 e1.printStackTrace(); 8 } 9 }

JDBC

JDBC 작업 과정 1.
데이터베이스와 연결하는 드라이버 파일을 찾아서 객체를 발생시킨다.

2.
연결을 관리하는 Connection 객체를 생성한다.

4~6.
작업을 처리할 Statement 또는  PreperedStatement 또는  CallableStatement 객체를 생성한다.

7.
반환되는 결과는 int 또는 ResultSet 객체에 담는다.

8.
접속을 종료한다.

1 Class.forName("..."); 2 Connection conn = DriverManager.getConnection("...","...","..."); 3 // String url = "프로토콜:서브프로토콜:SID"; 4 Statement stmt = conn.createStatement();//정적 쿼리 5 PreparedStatement prepStmt = conn.prepareStatement("...");//동적 쿼리 6 CallableStatement callStmt = conn.prepareCall("...");// 프로시저 처리 7 ResultSet result = stmt.executeQuery(query); 8 conn.close();

SQLite JDBC

SQLite JDBChttp://www.zentus.com/sqlitejdbc/

사용법 1 import java.sql.*; 2 3 public class Test { 4 public staticvoidmain(String[] args)throws Exception { 5 Class.forName("org.sqlite.JDBC"); 6 Connection conn = 7 DriverManager.getConnection("jdbc:sqlite:test.db"); 8 Statement stat = conn.createStatement(); 9 stat.executeUpdate("drop table if exists people;");10 stat.executeUpdate("create table people (name, occupation);");11 PreparedStatement prep = conn.prepareStatement(12 "insert into people values (?, ?);");13 14 prep.setString(1,"Gandhi");15 prep.setString(2,"politics");16 prep.addBatch();17 prep.setString(1,"Turing");18 prep.setString(2,"computers");19 prep.addBatch();20 prep.setString(1,"Wittgenstein");21 prep.setString(2,"smartypants");22 prep.addBatch();23 24 conn.setAutoCommit(false);25 prep.execu…

jLayer

jLayer - MP3 Libraryhttp://www.javazoom.net/

자바SE만으로는 MP3를 재생할 수 없다. 라이센스 때문이다.
따라서, Java를 사용해서 MP3를 재생하려면 이 라이브러리를 이용하는 것이 바람직하다. 이 라이브러리의 라이센스는 LGPL이다.

기본적인 사용법 InputStream을 넘겨서 Player 객체를 생성해주고 play().
public staticvoidmain(String[] args) { FileInputStream fis;try{ fis =newFileInputStream(newFile("test.mp3")); Player player =newPlayer(fis); player.play();}catch(FileNotFoundException e) { e.printStackTrace();}catch(JavaLayerException e) { e.printStackTrace();}}
AdvancedPlayer 객체 또한 비슷한 방식으로 사용할 수 있겠다 싶다.
자세한 설명은 생략한다.

java.util.StringTokenizer

String str ="abc@def.com"; StringTokenizer token =newStringTokenizer(str,"@.");while(token.hasMoreTokens()) { System.out.println(token.nextToken());}
StringTokenizer 생성자의 두 번째 매개변수의 각 문자를 기준으로 첫 번째 문자열을 토막낸다.

Proguard

Proguardhttp://proguard.sourceforge.net/

자바 파일의 난독화(Ofuscator).

Launch4j

Launch4jhttp://launch4j.sourceforge.net/

자바 패키지 파일인 Jar 파일을 윈도우즈 실행 파일인 Exe 파일로.

JD

JDhttp://java.decompiler.free.fr/

자바 디컴파일러.

동기화

지역 동기화synchronized(this) {...
메서드 동기화synchronizedvoidrun() {...

java.lang.Runnable

class Runnable1 implements Runnable {publicvoidrun() {...}}
Runnable1 run1 =newRunnable1(); Thread th =newThread(run1); th.start();

Runnale을 구현한 경우에는 Thread와 달리 start()메서드가 없으므로 별도의 Thread에 담아서 실행해야 한다.

java.lang.Thread

class Thread1 extends Thread {publicvoidrun() {...}}
Thread1 th =newThread1(); th.start();

static int activeCount() 현재 활성 상태인 스레드의 갯수를 반환한다.

static Thread currentThread() 현재 실행 중인 스레드를 반환한다.

static int enumerate(Thread[] arr) 활성중인 모든 스레드를 주어진 배열에 전달한다.

String getName()
void setName(String name)
int getPriority()
void setPriority(int priority)
void interrupt() 스레드를 중지.

static boolean interrupted() 현재 스레드가 중지 되었는가.

void join() 스레드가 종료될 때까지 기다린다. 이 스레드가 계속 실행된다.

static void sleep(long millisec) 지정된 시간 동안 현재 스레드를 멈춘다.

static void yield() 현재 스레드를 잠시 멈추고 다른 스레드가 실행될 수 있도록 한다.

바이트 입출력

1바이트 출력FileOutputStream fos =newFileOutputStream(FileDescriptor.out); BufferedOutputStream bos =newBufferedOutputStream(fos,2048); DataOutputStream dos =newDataOutputStream(bos); dos.writeXXX(..); dos.flush(); dos.close();
FileDescriptor.out은 콘솔에 대한 출력임.
버퍼의 크기는 파일인 경우에는 1024, 네트워크인 경우에는 512정도가 적당함.


1바이트 입력FileInputStream fis =newFileInputStream(FileDescriptor.in); BufferedInputStream bis =newBufferedInputStream(fis,2048); DataInputStream dis =newDataInputStream(bis);char ch = (char) dis.read();byte[] by =newbyte[1024]; dis.read(by); dis.readXXX(..); dis.close();
FileDescriptor.in은 콘솔에 대한 입력임.

문자 입출력

텍스트 출력OutputStreamWriter osw =newOutputStreamWriter(System.out);// FileWriter osw = new FileWriter(파일객체); BufferedWriter bw =newBufferedWriter(osw, 바이트수); PrintWriter out =newPrintWriter(bw);
텍스트 입력InputStreamReader isr =newInputStreamReader(System.in);// FileReader isr = new FileReader(파일객체); BufferedReader in=newBufferedReader(isr);

객체 입출력

객체 출력FileOutputStream fos =newFileOutputStream(파일객체); BufferedOutputStream bos =newBufferedOutputStream(fos, 바이트수); ObjectOutputStream oos =newObjectOutputStream(bos);
객체 입력FileInputStream fis =newFileInputStream(파일객체); BufferedInputStream bis =newBufferedInputStream(fis, 바이트수); ObjectInputStream ois =newObjectInputStream(bis);

주석

프로그램 실행에 영향을 미치지 않으며 소스코드의 내용을 설명하는 글을 주석이라고 한다.
자바는 3가지 유형의 주석을 지원한다.

C언어 형식/* ... ... */ 여러 줄 주석

C++언어 형식// ... ... 한 줄 주석

Java Doc 형식/** ... ... */ 문서화를 위한 주석