As you’ll see, there are a number of issues that make this a more complicated problem than it seems...

Linki


» Dzieci to nie książeczki do kolorowania. Nie da siÄ™ wypeÅ‚nić ich naszymi ulubionymi kolorami.
»
Mimo tych problemów oraz mimo braku zgodnoÅ›ci miÄ™dzy wÅ‚asno­Å›ciami czÄ…stek przewidywanych w teoriach supergrawitacji a wÅ‚asnoÅ›ciami czÄ…stek...
»
 Z tego wszystkiego wyÅ‚ania siÄ™ inny interesujÄ…cy problem: w jaki sposób wyzwania - takie jak rozlew krwi, rewolucja czy inny wstrzÄ…s - pomagajÄ… nam...
»
Deklaracja niepodleg³oœci by³a pocz¹tkiem nowej fazy konfliktu, który przesta³ byæ wy³¹cznie problemem w stosunkach Rodezji z Wielk¹ Brytani¹, ale zosta³ przeniesiony...
»
Tamto pytanie zaprowadziło ich do trudnych problemów etyki, ale to wszystko wydarzyło się tak dawno, że trudno było przypomnieć sobie dokładnie, co wtedy...
»
Rozpatruj¹c to zagadnienie trzeba wróciæ do podstawowego dla socjologii sztuki problemu zró¿nicowania odbioru przekazów estetycznych w zale¿noœci od spo³ecznego...
»
Luiza de Nègrepelisse nie myślała dotąd nad tym problemem, który niewątpliwie miał dla niej swą wagę, więcej z powodu przeszłości niż teraźniejszości...
»
stanowi³o jeden z najpowa¿niejszych problemów, z jakim musia³a siê uporaæówczesna Europa, i z pewnoœci¹ czytelnicy Nostradamusa poszukiwali w je-go...
»
Venizelos poczekał, aż zajmą się uporządkowywaniem dokumentów, i dał znak trzem podoficerom, by pomogli im uporać się z problemem...
»
Natomiast Taleniekow miaÅ‚ coraz wiÄ™ksze problemy z przetrwa­niem u siebie, w Moskwie...
»
01900–02039: SQL Parsing ORA–02020 too many database links in use Cause The maximum number of active connections to remote databases...

Dzieci to nie książeczki do kolorowania. Nie da się wypełnić ich naszymi ulubionymi kolorami.

It would be ideal to write the applet using Java 1.1 but that’s hardly practical. At this writing, the number of users running Java 1.1-enabled browsers is small, and although such browsers are now commonly available, you’ll probably need to take into account that a significant number of users will be slow to upgrade. So to be on the safe side, the applet will be programmed using only Java 1.0 code. With this in mind, there will be no JAR files to combine .class files in the applet, so the applet should be designed to create as few .class files as possible to minimize download time.
Well, it turns out the Web server (the one available to me when I wrote the example) does have Java in it, but only Java 1.0! So the server application must also be written using Java 1.0.
The server application
Now consider the server application, which will be called NameCollector. What happens if more than one user at a time tries to submit their email addresses? If NameCollector uses TCP/IP sockets, then it must use the multithreading approach shown earlier to handle more than one client at a time. But all of these threads will try to write to a single file where all the email addresses will be kept. This would require a locking mechanism to make sure that more than one thread doesn’t access the file at once. A semaphore will do the trick, but perhaps there’s a simpler way.
If we use datagrams instead, multithreading is unnecessary. A single datagram socket will listen for incoming datagrams, and when one appears the program will process the message and send the reply as a datagram back to whomever sent the request. If the datagram gets lost, then the user will notice that no reply comes and can then re-submit the request.
When the server application receives a datagram and unpacks it, it must extract the email address and check the file to see if that address is there already (and if it isn’t, add it). And now we run into another problem. It turns out that Java 1.0 doesn’t quite have the horsepower to easily manipulate the file containing the email addresses (Java 1.1 does).
However, the problem can be solved in C quite readily, and this will provide an excuse to show you the easiest way to connect a non-Java program to a Java program. A Runtime object for a program has a method called exec( ) that will start up a separate program on the machine and return a Process object. You can get an OutputStream that connects to standard input for this separate program and an InputStream that connects to standard output. All you need to do is write a program using any language that takes its input from 674
Thinking in Java
www.BruceEckel.com
standard input and writes the output to standard output. This is a convenient trick when you run into a problem that can’t be solved easily or quickly enough in Java (or when you have legacy code you don’t want to rewrite). You can also use Java’s native methods (see Appendix A) but those are much more involved.
The C program
The job of this non-Java application (written in C because Java wasn’t appropriate for CGI programming; if nothing else, the startup time is prohibitive) is to manage the list of email addresses. Standard input will accept an email address and the program will look up the name in the list to see if it’s already there. If not, it will add it and report success, but if the name is already there then it will report that. Don’t worry if you don’t completely understand what the following code means; it’s just one example of how you can write a program in another language and use it from Java. The particular programming language doesn’t really matter as long as it can read from standard input and write to standard output.
//: Listmgr.c
// Used by NameCollector.java to manage
// the email list file on the server
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BSIZE 250
int alreadyInList(FILE* list, char* name) {
char lbuf[BSIZE];
// Go to the beginning of the list:
fseek(list, 0, SEEK_SET);
// Read each line in the list:
while(fgets(lbuf, BSIZE, list)) {
// Strip off the newline:
char * newline = strchr(lbuf, '\n');
if(newline != 0)
*newline = '\0';
if(strcmp(lbuf, name) == 0)
return 1;
}
return 0;
}
int main() {
char buf[BSIZE];
FILE* list = fopen("emlist.txt", "a+t");
if(list == 0) {
perror("could not open emlist.txt");
exit(1);
}
while(1) {
gets(buf); /* From stdin */
if(alreadyInList(list, buf)) {
printf("Already in list: %s", buf);
fflush(stdout);
}
Chapter 15: Network Programming
675
else {
fseek(list, 0, SEEK_END);
fprintf(list, "%s\n", buf);
fflush(list);
printf("%s added to list", buf);

Powered by MyScript