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ányMéret
Csomag ikon JChat.zip90.16 KB
Csomag ikon SwingChatClient.zip54.93 KB