Jump to content

java client-server chat


nuubik
 Share

Recommended Posts

Tātad, man ir udevums, izmantojot internetu( kodus var meklēt arī internetā ) atrast un izpidīt sekojošu uzdevumu:

 

Jāizveido čats, klients-servers programmu. Nepieciešams čatošanas rezultātus saglabāt failā/os (logošana) servera pusē.

Programmu esmu atradis un pārbaudījis tās darbību, vienīgā problēma ir tāda, ka es nekādīgi nespēju izveidot operāciju, lai visu čatošanu programma saglabātu failā (os (logošana) servera pusē). Varbūt kāds varētu palīdzēt šajā sakarā?

Kodi :

Servera kods -

package multithreadchatserver;
import java.io.*;
import java.net.*;
public class MultiThreadChatServer{
static  Socket clientSocket = null;
static  ServerSocket serverSocket = null;
static  clientThread t[] = new clientThread[10];		  

public static void main(String args[]) {

int port_number=2222;

if (args.length < 1)
 {
 System.out.println("Usage: java MultiThreadChatServer \n"+
   "Now using port number="+port_number);
 } else {
 port_number=Integer.valueOf(args[0]).intValue();
 }
	try {
 serverSocket = new ServerSocket(port_number);
	}
	catch (IOException e)
 {System.out.println(e);}

while(true){
 try {
 clientSocket = serverSocket.accept();
 for(int i=0; i<=9; i++){
  if(t[i]==null)
  {
   (t[i] = new clientThread(clientSocket,t)).start();
   break;
  }
 }
 }
 catch (IOException e) {
 System.out.println(e);}
}
}
}
class clientThread extends Thread{

DataInputStream is = null;
PrintStream os = null;
Socket clientSocket = null;	  
clientThread t[];

public clientThread(Socket clientSocket, clientThread[] t){
this.clientSocket=clientSocket;
	this.t=t;
}

public void run()
{
String line;
	String name;
try{
 is = new DataInputStream(clientSocket.getInputStream());
 os = new PrintStream(clientSocket.getOutputStream());
 os.println("Enter your name.");
 name = is.readLine();
 os.println("Hello "+name+" to our chat room.\nTo leave enter /quit in a new line");
 for(int i=0; i<=9; i++)
 if (t[i]!=null && t[i]!=this)
  t[i].os.println("*** A new user "+name+" entered the chat room !!! ***" );
 while (true) {
 line = is.readLine();
			if(line.startsWith("/quit")) break;
 for(int i=0; i<=9; i++)
  if (t[i]!=null)  t[i].os.println("<"+name+"> "+line);
 }
 for(int i=0; i<=9; i++)
 if (t[i]!=null && t[i]!=this)
  t[i].os.println("*** The user "+name+" is leaving the chat room !!! ***" );

 os.println("*** Bye "+name+" ***");
 for(int i=0; i<=9; i++)
 if (t[i]==this) t[i]=null;

 is.close();
 os.close();
 clientSocket.close();
}
catch(IOException e){};
}
}

 

Klienta kods:

package multithreadchatclient;
import java.io.*;
import java.net.*;
public class MultiThreadChatClient implements Runnable{

static Socket clientSocket = null;
static PrintStream os = null;
static DataInputStream is = null;
static BufferedReader inputLine = null;
static boolean closed = false;

public static void main(String[] args) {

int port_number=2222;
	String host="localhost";

if (args.length < 2)
 {
 System.out.println("Usage: java MultiThreadChatClient  \n"+
   "Now using host="+host+", port_number="+port_number);
 } else {
 host=args[0];
 port_number=Integer.valueOf(args[1]).intValue();
 }
try {
		clientSocket = new Socket(host, port_number);
		inputLine = new BufferedReader(new InputStreamReader(System.in));
		os = new PrintStream(clientSocket.getOutputStream());
		is = new DataInputStream(clientSocket.getInputStream());
	} catch (UnknownHostException e) {
		System.err.println("Don't know about host "+host);
	} catch (IOException e) {
		System.err.println("Couldn't get I/O for the connection to the host "+host);
	}


	if (clientSocket != null && os != null && is != null) {
		try {


			new Thread(new MultiThreadChatClient()).start();

 while (!closed) {
				os.println(inputLine.readLine());
			}

 os.close();
 is.close();
 clientSocket.close();  
		} catch (IOException e) {
			System.err.println("IOException:  " + e);
		}
	}
}		  

public void run() {
String responseLine;

try{
 while ((responseLine = is.readLine()) != null) {
 System.out.println(responseLine);
 if (responseLine.indexOf("*** Bye") != -1) break;
 }
		closed=true;
} catch (IOException e) {
 System.err.println("IOException:  " + e);
}
}
}

Labots - nuubik
Link to comment
Share on other sites

AutoIT ir feina programiņa kas tev ļaus izveidot Windows skriptus kā programmiņas (tu uzraksti relatīvi vienkāršus skriptus un softs izdarīs visu compiling utt kā rezultātā tev nevajag zināt C# vai C++)

 

Re kur links uz mājaslapu - http://www.autoitscript.com/

Es šo figņu personīgi biju lietojis, lai konkrēti automatizētu pāris excel failu pārkopēšanu un arhivēšanu, bet konkrēti ir arī iespēja izveidot Log failus pie kā šobrīd darbojos, lai ieviestu gadījumiem, ja kkas noiet greizi.

Link to comment
Share on other sites

autoram derētu vispirms saprast, kas tur notiek, kas tie par thread`iem un kur vispār notiek kāda darbība.

Un loģiski padomājot, pievienot to 1 rindu, lai visas darbības logotos.

 

 

Intereses pēc - kas tā ir par koledžu, kur atbalsta IT speciālistu augšanu, "ar interneta kodiem"?

Par AutoIt - šajā gadījumā tikpat noderīgs kā Winamp.

Link to comment
Share on other sites

Vienkārši - pēc šīs rindiņas

line = is.readLine();

saglabā (append) line iekš faila.

 

Labāks variants ir uzrakstīt atsevišķu thread, kas to dara.

 

Intereses pēc - kas tā ir par koledžu, kur atbalsta IT speciālistu augšanu, "ar interneta kodiem"?

 

LOL, tas kods ir kautkur atrasts !

Man jau likās savādi, ka cilvēks, kas var uzrakstīt to kodu, nespēj pievienot logging.

Link to comment
Share on other sites

autoram derētu vispirms saprast, kas tur notiek, kas tie par thread`iem un kur vispār notiek kāda darbība.

Un loģiski padomājot, pievienot to 1 rindu, lai visas darbības logotos.

 

 

Intereses pēc - kas tā ir par koledžu, kur atbalsta IT speciālistu augšanu, "ar interneta kodiem"?

Par AutoIt - šajā gadījumā tikpat noderīgs kā Winamp.

 

Lasīju cilvēkam grūtības sagādā Javā pievienot logging opciju, Java nekad neesmu bakstījis, tādēļ iedevo pašu vienkāršāko alternatīvu ... nosūti info ko tu vēlies logot uz AutoIt skriptu kas tālāk nodarbojas ar to logošanu ... Jā nav tas efektīvākais, vai labākais vaiants, bet toties tas vismaz ir kas vairāk par nekādu variantu.

 

EDIT: Man gan radās jautājums šo rakstot .... kā/kur paredzēts integrēt šo Java kodu? Mans piedāvātais variants ir pilnīgs fufelis gadījumā, ja skripts tiek integrēts attālināti hostētā serverī pie kā nav pieeja pieslēgties caur nekādu Remote Desktop

Labots - K.Kavacis
Link to comment
Share on other sites

šis ir tipisks studenta jautājums "nokačāju kodu no 11 gadus vecas lapas http://www.ase.md/~aursu/ClientServerThreads.html vai kāda saita, kurš to ir pārpublicējis vēlākos gados un pievienojis pakotnes nosaukumu". Lai nodotu pasniedzējam, kurš noliks kaudzītē un ieliks ķeksīti, ka praktiskais darbs veiksmīgi izdarīts.

 

 

Man tikai interesē, kas tā ir par mācību iestādi? Tīri interesei. Latvijā ir parādījusies kāda Turības tipa mācību iestāde, kur IT darbiniekus sagatavo un ļauj paķēpāties, vienalga ar ko, lai skaitītos "iepazinušies ar sfēru"?

Link to comment
Share on other sites

... nosūti info ko tu vēlies logot uz AutoIt skriptu kas tālāk nodarbojas ar to logošanu ... Jā nav tas efektīvākais

 

Nelien diskusijās, par kurām tev nav pilnīgi nekādas sapratnes. Kāds vēl te fuck1ng skripts vajadzīgs ?

Link to comment
Share on other sites

 

Nelien diskusijās, par kurām tev nav pilnīgi nekādas sapratnes. Kāds vēl te fuck1ng skripts vajadzīgs ?

 

Jo Javu neuzskatu par programmēšanas valodu tā pat kā mājaslapu veidotājus neviens nesauc par datorprogrammētājiem tā vien tāda skriptošana ir, tādēļ to tā arī saucu - par skriptošanu

Link to comment
Share on other sites

Vienkārši - pēc šīs rindiņas

line = is.readLine();

saglabā (append) line iekš faila.

 

Labāks variants ir uzrakstīt atsevišķu thread, kas to dara.

 

 

 

LOL, tas kods ir kautkur atrasts !

Man jau likās savādi, ka cilvēks, kas var uzrakstīt to kodu, nespēj pievienot logging.

 

Mēģināju gan šādi :

 

BufferedWriter out = new BufferedWriter(new FileWriter("test.txt"));

out.write("line");

out.newLine();

Gan šādi:

 

try {

BufferedWriter out = new BufferedWriter(new FileWriter("test.txt"));

out.write("line");

out.newLine();

}

catch (IOException e)

{ System.out.println("Exception "); }

 

Abos gadījumos izveidojās txt fails, bet nekas netika saglabāts(logošanai bija jābūt servera pusē)

Runājot par to skolu padarīšanu, manuprāt nav tīri normāli mācīt cilvēkiem, kuriem vispār nav nekad bijusi saskare ar javu tikai vienu semestri šo priekšmetu + neskatoties uz nekādām zināšanām vispār , sākt mācīt javu ar dažādu spēļu u.t.t izveidi, nevis elementāriem pamatiem.

Link to comment
Share on other sites

Mezavecis

No kāda cauruma izlīdi, ka izsaki šādus apgalvojumus? Tak palasi, kas vispār Java tāda ir.

http://en.wikipedia.org/wiki/Java_%28programming_language%29

Jo Javu neuzskatu par programmēšanas valodu tā pat kā mājaslapu veidotājus neviens nesauc par datorprogrammētājiem tā vien tāda skriptošana ir, tādēļ to tā arī saucu - par skriptošanu

  • Patīk 1
Link to comment
Share on other sites

autor: pēc visām tām darbībām .write() un .newLine() izpildi arī

 

out.flush();

 

tas izgāž failā visu, kas sakrājies.

Labots - usver
Link to comment
Share on other sites

autor: pēc visām tām darbībām .write() un .newLine() izpildi arī

 

 

 

tas izgāž failā visu, kas sakrājies.

 

Tagad kkas sāk sanākt, tikai baigi dīvaini, ka vinsh izvada tikai pēdējo ko esmu uzrakstijis, respektiivi, /quit , lai iziet no chata

Link to comment
Share on other sites

pēc Maris_O norādēm raksti - rindiņas, kas darbojas ar "out" cieši klāt, neaizmirstot arī ".close()".

ja neizdodas- iepeisto, kuru vietu un uz ko esi mainījis.

Link to comment
Share on other sites

pēc Maris_O norādēm raksti - rindiņas, kas darbojas ar "out" cieši klāt, neaizmirstot arī ".close()".

ja neizdodas- iepeisto, kuru vietu un uz ko esi mainījis.

 

Ievietoju:

BufferedWriter out = new BufferedWriter(new FileWriter("test.txt"));
out.write(line);
out.flush();
out.close();

Uzreiz zem rindiņas line = is.readLine(); - taču vienīgais ko programma ieraksta failā ir /quit , jeb pēdējā komanda ko es uzrakstu, lai pamestu čatu

 

Labots: Sapratu to, ka programma saglaba teksta failā principā to, ko es pēdējo uzrakstu vispār, nevis ņem no sakuma un turpina rakstīt failā visu ko raksta, bet pie jebkuras palaišanas tikai pēdējo uzrakstīto saglabā

Labots - nuubik
Link to comment
Share on other sites

BufferedWriter out = new BufferedWriter(new FileWriter("test.txt", true));

 

no references:

 

FileWriter(String fileName, boolean append)

Constructs a FileWriter object given a file name with a boolean indicating whether or not to append the data written.

Link to comment
Share on other sites

BufferedWriter out = new BufferedWriter(new FileWriter("test.txt", true));

 

no references:

 

FileWriter(String fileName, boolean append)

Constructs a FileWriter object given a file name with a boolean indicating whether or not to append the data written.

 

Paldies, tagad visu logo, bet man radās jautājums, vai šeit arī pastāv iespēja, izmantojot /n sadalīt to visu rindiņās, lai būtu labāk parskatāms?

Link to comment
Share on other sites

sadalīt pa rindiņām var

 

out.write(line);

out.write('\n');
out.write('\t');
out.write("atkāpe");
out.write('\t');
out.write("vēl pēc atkāpes");
out.flush();
out.close();

 

vai vienkārši

out.write(line);

out.write('\n' + '\t' + "atkāpe" + '\t' + "vēl pēc atkāpes");
out.flush();
out.close();

tātad - specsimboli (\n, \t, utt ) apostrofos, bet stingi - pēdiņās.

Link to comment
Share on other sites

...tā vien tāda skriptošana ir...

Nē, Tu nezinu ne sūda.

Un iepriekš rakstītais vedina domāt, ka tāpat, kā daudzi citi iesācēji, Tu Javu jauc ar Javascriptu.

(Pie kam arī Javascript ir Tjuring complete!)

 

Edit. Ļoti atvainojos par šo offtopic.

Labots - japets
Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...