9월, 2012의 게시물 표시

소켓 프로그래밍

아래의 소켓 서버/클라이언트 소스코드는 각각 콘솔에서 실행되며, 클라이언트로부터 한 줄을 입력 받아 서버에서 해당 내용을 출력하고, 다시 그 내용을 클라이언트에 보내면, 클라이언트가 받은 메시지를 출력한다. 테스트를 위해 로컬 호스트 주소를 사용하고 있으며, 포트번호는 11111을 사용했다. 다중 클라이언트에 응답하는 서버를 만드려면 스레드로 처리해야 한다. 소켓 클라이언트 소켓을 연다. 소켓에 대해 입출력 스트림을 연다. 서버의 프로토콜에 맞게 입출력 스트림에서 읽거나 쓴다. 스트림을 닫는다. 소켓을 닫는다. 1 public static void main ( String [] args ) throws IOException { 2 // 소켓을 연다. 3 Socket socket = new Socket ( InetAddress . getLocalHost (), 11111 ); 4 5 // 입출력스트림을 연다. 6 PrintWriter out = new PrintWriter ( socket . getOutputStream (), true ); 7 BufferedReader in = new BufferedReader ( new InputStreamReader ( socket . getInputStream ())); 8 9 // 콘솔에서 입력받는다. 10 BufferedReader stdIn = new BufferedReader ( new InputStreamReader ( System . in )); 11 String userInput ; 12 13 while (( userInput = stdIn . readLine ()) != null ) { 14 // 입력받은 내용을 소켓에 쓴다. 15 out . println ( userInput ); 16

java.net.URLConnection

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

java.net.Socket

이 요약은 사용할 수 없습니다. 이 글을 보려면 여기를 클릭하세요.

java.net.ServerSocket

Server 1 ServerSocket serverSocket = new ServerSocket ( 1234 ); 2 while ( true ) { 3 Socket socket = serverSocket . accept (); 4 InputStreamReader isr = new InputStreamReader ( socket . getInputStream ()); 5 BufferedReader br = new BufferedReader ( isr , 512 ); 6 String data = br . readLine (); 7 br . close (); 8 } Client 1 InetAddress addr = InetAddress . getByName ( "..." ); 2 Socket socket = new Socket ( addr , 1234 ); 3 OutputStreamWriter osw = new OutputStreamWriter ( socket . getOutputStream ()); 4 BufferedWriter bw = new BufferedWriter ( osw , 512 ); 5 PrintWriter pw = new PrintWriter ( 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 static void main ( String [] args ) { 2 try { 3 //연결 4 URL url = new URL ( "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 = new OutputStreamWriter ( conn . getOutputStream ()); 16 osw . write ( param ); 17 osw . flush (); 18 19 /

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 = new Date (); 2 SimpleDateFormat f = new SimpleDateFormat ( "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 ( new Runnable (){ 2 public void run () { 3 JFrame win = new JFrame (); 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 = new JarFile ( getClass (). getProtectionDomain (). getCodeSource (). getLocation (). toURI ()); 2 JarEntry entry = jarFile . getJarEntry ( "kr/pe/elex/files/textFile.txt" ); 3 InputStreamReader input = new InputStreamReader ( jarFile . getInputStream ( entry ) );

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

버튼 등에서 이벤트를 받아서 임의의 URL로 이동하는 브라우저를 띄우려거든 리스너에 다음과 같이 구현한다. 1 public void actionPerformed ( 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 JDBC http://www.zentus.com/sqlitejdbc/ 사용법 1 import java . sql .*; 2 3 public class Test { 4 public static void main ( 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 , "

jLayer

jLayer - MP3 Library http://www.javazoom.net/ 자바SE만으로는 MP3를 재생할 수 없다. 라이센스 때문이다. 따라서, Java를 사용해서 MP3를 재생하려면 이 라이브러리를 이용하는 것이 바람직하다. 이 라이브러리의 라이센스는 LGPL이다. 기본적인 사용법 InputStream을 넘겨서 Player 객체를 생성해주고 play(). public static void main ( String [] args ) { FileInputStream fis ; try { fis = new FileInputStream ( new File ( "test.mp3" )); Player player = new Player ( fis ); player . play (); } catch ( FileNotFoundException e ) { e . printStackTrace (); } catch ( JavaLayerException e ) { e . printStackTrace (); } } AdvancedPlayer 객체 또한 비슷한 방식으로 사용할 수 있겠다 싶다. 자세한 설명은 생략한다.

java.util.StringTokenizer

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

Proguard

Proguard http://proguard.sourceforge.net/ 자바 파일의 난독화(Ofuscator).

Launch4j

Launch4j http://launch4j.sourceforge.net/ 자바 패키지 파일인 Jar 파일을 윈도우즈 실행 파일인 Exe 파일로.

JD

JD http://java.decompiler.free.fr/ 자바 디컴파일러.

동기화

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

java.lang.Runnable

class Runnable1 implements Runnable { public void run () { ... } } Runnable1 run1 = new Runnable1 (); Thread th = new Thread ( run1 ); th . start (); Runnale을 구현한 경우에는 Thread와 달리 start()메서드가 없으므로 별도의 Thread에 담아서 실행해야 한다.

java.lang.Thread

class Thread1 extends Thread { public void run () { ... } } Thread1 th = new Thread1 (); 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 = new FileOutputStream ( FileDescriptor . out ); BufferedOutputStream bos = new BufferedOutputStream ( fos , 2048 ); DataOutputStream dos = new DataOutputStream ( bos ); dos . writeXXX (..); dos . flush (); dos . close (); FileDescriptor.out은 콘솔에 대한 출력임. 버퍼의 크기는 파일인 경우에는 1024, 네트워크인 경우에는 512정도가 적당함. 1바이트 입력 FileInputStream fis = new FileInputStream ( FileDescriptor . in ); BufferedInputStream bis = new BufferedInputStream ( fis , 2048 ); DataInputStream dis = new DataInputStream ( bis ); char ch = ( char ) dis . read (); byte [] by = new byte [ 1024 ]; dis . read ( by ); dis . readXXX (..); dis . close (); FileDescriptor.in은 콘솔에 대한 입력임.

문자 입출력

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

객체 입출력

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

주석

프로그램 실행에 영향을 미치지 않으며 소스코드의 내용을 설명하는 글을 주석이라고 한다. 자바는 3가지 유형의 주석을 지원한다. C언어 형식 /* ... ... */ 여러 줄 주석 C++언어 형식 // ... ... 한 줄 주석 Java Doc 형식 /** ... ... */ 문서화를 위한 주석