1.1.10.1. fejezet, TCP chat kliens/szerver
Egy egyszerű chat programot írtam 2005-ben, még notepad-on és konzolon. Azóta több segédeszköz megjelent már, mint pl. a NetBeans vagy Eclipse. A NetBeans-t ki is próbáltam, hogy megírjam a kliens Swing változatát. Az egyszerű szövegszerkesztő program kevés támpontot adott a Java programozásához, viszont sok segítséget találtam egy könyvben, amit "Java 1.1 útikalauz programozóknak" címen adott ki az ELTE TTK hallgatói alapítvány 1998-ban. Juhász Attila kollégámtól kaptam, neki köszönhetem hogy elkezdtem Java-val foglalkozni.
Egy server, egy AWT és egy Applet kliens található a JChat.zip csomagban, ez utóbbi aláírásáról és hálózati forgalmának engedélyezéséről is gondoskodik a mellékelt sign.bat script és chatclient.policy. Az applet HTML-be ágyazása:
<HTML> <BODY> <APPLET CODE="ChatHClient.class" ARCHIVE="chatclient.jar" WIDTH=640 HEIGHT=480> <PARAM NAME="SERVER" VALUE="192.168.1.5"> <PARAM NAME="PORT" VALUE="1234"> <PARAM NAME="NAME" VALUE="Zoli"> </APPLET> </BODY> </HTML>
chatclient.policy
keystore "file:~/.keystore"; grant signedBy "Zoltan" { permission java.net.SocketPermission "localhost", "listen", signedBy "Zoltan"; }; grant signedBy "Zoltan" { permission java.net.SocketPermission "192.168.1.5", "listen", signedBy "Zoltan"; };
Alacsony szintű hálózati kapcsolat kezelő a SocketHandler.java-ban:
import java.awt.*; import java.io.*; import java.net.*; //import IMsg; public class SocketHandler extends Thread { protected BufferedReader input; protected PrintWriter output; protected Socket cs; protected IMsg Owner; public String received; SocketHandler(String login_name,String Srv,String Prt,IMsg Ownr) throws Throwable { super(login_name); Owner = Ownr; Owner.Dispatch(this,"[COMMON]"+"Creating SocketHandler thread to "+Srv+":"+Prt+" as "+login_name+" ...\n"); cs = new Socket(Srv, Integer.parseInt(Prt)); Owner.Dispatch(this,"[COMMON]"+"Socket created.\n"); } public String sendMsg(String Msg) { try { Owner.Dispatch(this,"[COMMON]"+"<"+getName()+"> "+Msg+"\n"); output.println(Msg); output.flush(); } catch(Exception e) { Owner.Dispatch(this,"[COMMON]"+e.toString()+"\n"); } return Msg; } protected void OpenSocket() throws Exception { Owner.Dispatch(this,"[COMMON]Opening connection...\n"); input = new BufferedReader(new InputStreamReader(cs.getInputStream()) ); output = new PrintWriter(cs.getOutputStream()); output.println(getName()); output.flush(); received="[COMMON]Connected."; } protected void CloseSocket() { try { input.close(); output.close(); cs.close(); Owner.Dispatch(this,"[COMMON]Disconnected.\n"); } catch (Exception e){Owner.Dispatch(this,"[COMMON]"+e.toString()+"\n");} } public void run() { try { Owner.Login(this); OpenSocket(); do { Owner.Dispatch(this,received+"\n"); received = input.readLine(); } while ( (!received.equals("DC")) && (!interrupted()) ); } catch (Exception e) { Owner.Dispatch(this,"[COMMON]"+e.toString()+"\n"); } CloseSocket(); Owner.Logout(this); } }
A hitelesítő kulcs elkészítése:
keytool -genkey -alias Zoltan -storepass kipkop -keypass kikopog -keystore ~/.keystore -dname "CN=Zoltan Papp,OU=development,O=PAZO Info-Kristaly BT.,L=Budapest,S=Hungary,C=EU"
A .jar fájl aláírása:
jarsigner chatclient.jar Zoltan -sectionsonly -keystore .keystore <pass.txt
Forráskód a SourceForge.net-en
Ebből a programból elkészült a titkosított csatornát használó változat, ami RSA/DSA titkosítást használ.
Forráskód a github-on: SSLChatServer, és SSLChatClient.
Csatolmány | Méret |
---|---|
JChat.zip | 90.16 KB |
SwingChatClient.zip | 54.93 KB |
- A hozzászóláshoz be kell jelentkezni