SDSU CS 580 Client-Server
Spring Semester, 2004
Server Intro
Previous    Lecture Notes Index    Next    
© 2004, All Rights Reserved, SDSU & Roger Whitney
San Diego State University -- This page last updated 19-Feb-04


Java Network Programming, Harold

VisualWorks Internet Client Developer's Guide & Socket. See

Doc 14, Server Intro Slide # 2
Reading AssignmentJava
Java Network Programming, Harold

Basic Network Concepts, Chapter 2
If you are not familiar with basic networking

Java I/O Chapter 4
If you are weak on Streams, Readers and Writers

Sockets for Servers Chapter 11


Internet Client Developer's Guide, Socket Programming Chapter 2.

Internet Client Developer's Guide is doc/NetClientDevGuide.pdf in the VisualWorks 7 installation

Doc 14, Server Intro Slide # 3

What is a Server?


Basic algorithm:

   while (true) {
     Wait for an incoming request;
     Perform whatever actions are requested;

Doc 14, Server Intro Slide # 4
Example - Echo Server

| server |
server := SocketAccessor newTCPserverAtPort: 9009.
server listenFor: 5.
 [ | acceptedSocket |
   "wait for a new connection"
   acceptedSocket := server accept.
   "fork off processing of the new stream socket"
   [ | stream char |
      stream := acceptedSocket readAppendStream.
      stream lineEndTransparent.
      [ (char := stream next) isNil ] whileFalse: [
         stream nextPut: char; commit ].
      stream close. 
   ] forkAt: Processor userSchedulingPriority -1.
] repeat. 

Doc 14, Server Intro Slide # 5
Some Basic Server Issues

Doc 14, Server Intro Slide # 6


Streams verses Buffers

Both Java & Smalltalk provide access to socket data via

Stream access is easier

Buffer access can be faster

We will cover Stream access first

Doc 14, Server Intro Slide # 7

Java TCP Sockets

Main Classes
Used by servers to listen for clients
Used by clients to talk to servers
Used by servers to talk to clients
ServerSocket basic methods

public ServerSocket(int port) //port = 0 gives random port
public ServerSocket(int port, int backlog)
public ServerSocket(int port, int backlog, InetAddress bindAddress)
public Socket accept() throws IOException
public void close() throws IOException
public int getLocalPort()

Socket basic methods

public InputStream getInputStream() throws IOException
public OutputStream getOutputStream() throws IOException

Doc 14, Server Intro Slide # 8

A Simple Date Server

public class DateServer {
   private static Logger log = Logger.getLogger("dateLogger");
    public static void main (String args[]) throws IOException {
      ProgramProperties flags = new ProgramProperties( args);
      int port = flags.getInt( "port" , 8765);
      new DateServer().run(port);
   public void run(int port) throws IOException {
      ServerSocket input = new ServerSocket( port );"Server running on port " + input.getLocalPort());
      while (true) {
         Socket client = input.accept();"Request from " + client.getInetAddress());

Doc 14, Server Intro Slide # 9
Processing Client Request

   void processRequest(InputStream in,OutputStream out)
      throws IOException {
      BufferedReader parsedInput = 
            new BufferedReader(new InputStreamReader(in));
      boolean autoflushOn = true;
      PrintWriter parsedOutput = new PrintWriter(out,autoflushOn);
      String inputLine = parsedInput.readLine();
      if (inputLine.startsWith("date")) {
         Date now = new Date();

Note: This server is just a first example. It needs a lot of work. We will be working on improving it in later lectures.

Doc 14, Server Intro Slide # 10
Running the Server

Sample run of DateServer.
(I typed everything appearing in bold font here.)

rohan 16-> java -jar DateServer.jar
Feb 19, 2004 10:56:59 AM DateServer run
INFO: Server running on port 8765

Al 13-> telnet 8765
Connected to
Escape character is '^]'.
Feb 19, 2004 10:57:34 AM DateServer run
INFO: Request from /

Thu Feb 19 10:57:39 PST 2004
Connection closed by foreign host.

Doc 14, Server Intro Slide # 11
Warning About telnet Usage

Using telnet to interact with a server is

Don’t design server assuming it interacts directly with a human!

Doc 14, Server Intro Slide # 12

Smalltalk TCP Sockets

Main Classes

Represents an IP address for a machine
Socket connection for server & client

SocketAccessor creation methods

newTCP            “selects random port”
newTCPserverAtPort: portNumber

SocketAccessor instance methods

   Wait for a client connection and return it
   return any waiting client connection, 
   return nil if no waiting client connections
   Return a stream of the given type on the conection

Doc 14, Server Intro Slide # 13

A Simple Date Server

Smalltalk defineClass: #SimpleDateServer
   superclass: #{Core.Object}
   indexedType: #none
   private: false
   instanceVariableNames: 'serverSocket '
   classInstanceVariableNames: ''
   imports: ''
   category: 'SimpleServer'

SimpleDateServer class methodsFor: 'instance creation'

port: anInteger
   ^super new setPort: anInteger 

Doc 14, Server Intro Slide # 14
SimpleDateServer instance methods

setPort: anInteger 
   serverSocket := SocketAccessor newTCPserverAtPort: anInteger.
      listenFor: 4;
      soReuseaddr: true 

   | childSocket clientConnection clientIOStream |
   [childSocket := serverSocket accept.
   clientIOStream := childSocket readAppendStream.
   clientIOStream lineEndTransparent.
   self processRequestOn: clientIOStream.] repeat

processRequestOn: anReadAppendStream 
   | clientRequest |
   clientRequest := anReadAppendStream through: Character cr.
   (clientRequest startsWith: 'date') 
      ifTrue: [anReadAppendStream nextPutAll: 
                  Time dateAndTimeNow printString].
   anReadAppendStream close
Running the Server

server := SimpleDateServer port: 5556.
serverProcess := [server run] fork

Doc 14, Server Intro Slide # 15

Simple Server Issues

Using our SimpleDateServer

      Client A builds connection to server, 
      Client A goes to lunch 
      Client B builds connection to server and ... :-( 

Multiple connections need to be accepted concurrently.

Doc 14, Server Intro Slide # 16


TCP accepts connections before the server is ready

TCP keeps a backlog queue of connections server has not accepted

Java ServerSocket constructor

SocketAccessor>>listenFor: aNumber

There is no reasonable way to find out:
Backlog Experiment

Start the SimpleDateServer

Connect to the server using telnet

While the server is waiting for you to type something

Connect to the server with a second telnet session

In the second session type “date” and return

What happens?

Now type “date” and return in the first session

What happens?

Doc 14, Server Intro Slide # 17

Multi-homed Machines

Some machines have two or more physical network interface

Each network interface has its own IP address
public ServerSocket(int port)
public ServerSocket(int port, int backlog, InetAddress bindAddress)

Doc 14, Server Intro Slide # 18

Reusing a Port

Closing TCP connections can remain for several minutes

TCP may block use of the port until the connection is gone

This can be annoying in development

SocketAccessor>> soReuseaddr: true

ServerSocket method setReuseAddress(boolean on)

Doc 14, Server Intro Slide # 19

End of Line

End of Line Convention
Line Feed (LF)
Carriage return (CR)

LF is ASCII character 10

CR is ASCII character 13

A server should not make assumptions about a client’s platform

A client should not make assumptions about a server’s platform

Client-server protocol should specify which characters are used

Doc 14, Server Intro Slide # 20
End of Line & Smalltalk

Java and Smalltalk programs run on all major platforms

Smalltalk assumes files use platform’s end of line convention

Smalltalk input streams convert platforms end of line to CR

Smalltalk output streams convert CR to platform’s end of line

This makes writing cross platform programs easier

Don’t want this to happen socket streams

BufferedExternalStream>> lineEndTransparent

How does Java handle this?

Doc 14, Server Intro Slide # 21

End of File

On a stream connected to a socket

End of file indicates that the connection has been closed!

Don’t use end of file to determine when other end is done talking!

Doc 14, Server Intro Slide # 22

End of Message

How do we know when we are at the end of a message?

BufferedReader parsedInput = 
      new BufferedReader(new InputStreamReader(in));

char[] message = new char[500];
int sizeRead =, 0, 500);

We still may not have the entire message!


Doc 14, Server Intro Slide # 23
End of Message

A good client-server protocol specifies

Main methods used:

Doc 14, Server Intro Slide # 24


Java & Smalltalk streams are buffered

TCP buffers output before sending

A server cannot read bytes left in a client’s buffer


PrintWriter flush();

Copyright ©, All rights reserved.
2004 SDSU & Roger Whitney, 5500 Campanile Drive, San Diego, CA 92182-7700 USA.
OpenContent license defines the copyright on this document.

Previous    visitors since 19-Feb-04    Next