A Simple Java TCP Server and TCP Client

Following up on my previous post, we also had to demonstrate a sample Java TCP Server and TCP Client. The code footprint pretty small and it gives you a good idea about how a TDP Server opens up a port, and then the TCP Client sends or receives data from that port.

This is a good page on the differences between TCP and UDP.

To compile these, install Java JDK to your system. Then compile the program with [cc inline=”1″]javac TCPClient.java – this will create a TCPClient.class. Execute the file with [cc inline=”1″]java TCPClient – leave off the .class, or you will get the error: “Exception in thread “main” java.lang.NoClassDefFoundError”.

Here is sample code for a simple Java TCP Server/Client, originally from the excellent Computer Networking: A Top Down Approach, by Kurose and Ross:

TCPServer.java

import java.io.*;
import java.net.*;

class TCPServer {
 public static void main(String argv[]) throws Exception {
  String clientSentence;
  String capitalizedSentence;
  ServerSocket welcomeSocket = new ServerSocket(6789);

  while (true) {
   Socket connectionSocket = welcomeSocket.accept();
   BufferedReader inFromClient =
    new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
   DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
   clientSentence = inFromClient.readLine();
   System.out.println("Received: " + clientSentence);
   capitalizedSentence = clientSentence.toUpperCase() + 'n';
   outToClient.writeBytes(capitalizedSentence);
  }
 }
}

Hi there you hard working student! Please consider signing up for Prime Student using the link to the right. You’ll get 6 months of FREE Amazon Prime which means 50% off normal shipping and other cool Amazon perks.

and the client:

TCPClient.java

import java.io.*;
import java.net.*;

class TCPClient {
 public static void main(String argv[]) throws Exception {
  String sentence;
  String modifiedSentence;
  BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
  Socket clientSocket = new Socket("localhost", 6789);
  DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
  BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
  sentence = inFromUser.readLine();
  outToServer.writeBytes(sentence + 'n');
  modifiedSentence = inFromServer.readLine();
  System.out.println("FROM SERVER: " + modifiedSentence);
  clientSocket.close();
 }
}

If you have any questions, please leave a comment!

43 replies
  1. Michel
    Michel says:

    Hi

    simply what I needed :)

    Is it possible to add persistence to this example (inserting the data into a Firebird db, the data is in binary format)?

    Best regards,
    Michel

  2. Michel
    Michel says:

    Hi

    simply what I needed :)

    Is it possible to add persistence to this example (inserting the data into a Firebird db, the data is in binary format)?

    Best regards,
    Michel

  3. The Professor
    The Professor says:

    I wrote my first Java socket client/server application in 1993! So this code looks mighty familiar.

    However, servers I’ve written subsequently all implement Thread so you can build a pool of connections available and new ones are spawned as traffic arrives. A small point, but one that makes this code scalable.

  4. The Professor
    The Professor says:

    I wrote my first Java socket client/server application in 1993! So this code looks mighty familiar.

    However, servers I’ve written subsequently all implement Thread so you can build a pool of connections available and new ones are spawned as traffic arrives. A small point, but one that makes this code scalable.

  5. Floatrolo
    Floatrolo says:

    Hi, Congratulations to the site owner for this marvelous work you’ve done. It has lots of useful and interesting data.

  6. Floatrolo
    Floatrolo says:

    Hi, Congratulations to the site owner for this marvelous work you’ve done. It has lots of useful and interesting data.

  7. Venessa
    Venessa says:

    you forgot

    import java.net.Socket;
    and
    public static void main(String[] args) throws IOException {

    anyway, thanks, exactly what I needed :)

  8. Venessa
    Venessa says:

    you forgot

    import java.net.Socket;
    and
    public static void main(String[] args) throws IOException {

    anyway, thanks, exactly what I needed :)

  9. vince
    vince says:

    Hi, there are nice work for a simple and easy understand server client example.
    However, I have some question which is:
    what is the use of ‘n’ in
    outToServer.writeBytes(sentence + ‘n’);

    i try to remove it and the program won’t work. Can you please do simple explain to me?
    Thanks

    Vince

  10. vince
    vince says:

    Hi, there are nice work for a simple and easy understand server client example.
    However, I have some question which is:
    what is the use of ‘\n’ in
    outToServer.writeBytes(sentence + ‘\n’);

    i try to remove it and the program won’t work. Can you please do simple explain to me?
    Thanks

    Vince

  11. Dave
    Dave says:

    @vince: \n stands for new line. This lets the TCP Server know that your sentence has been sent. Let me know if you have any other questions.

  12. grüner tee
    grüner tee says:

    The Java Tutorials are practical guides for programmers who want to use the Java programming language to create applications.

  13. grüner tee
    grüner tee says:

    The Java Tutorials are practical guides for programmers who want to use the Java programming language to create applications.

  14. sara
    sara says:

    HI,,,,
    I have cpyied the TCPClient code on my pc
    and the TCPServer code on another pc but nothing happened
    “there is no error”.
    please reply

  15. sara
    sara says:

    HI,,,,
    I have cpyied the TCPClient code on my pc
    and the TCPServer code on another pc but nothing happened
    “there is no error”.
    please reply

  16. AbdelAziz
    AbdelAziz says:

    Thanks man…
    it really helps… :)
    but I would like to modify this code so that the client sends a request to the server to “add 10 20” then the server will calculate it and send back 30 :) I will try to do.. thanks dude

  17. AbdelAziz
    AbdelAziz says:

    Thanks man…
    it really helps… :)
    but I would like to modify this code so that the client sends a request to the server to “add 10 20” then the server will calculate it and send back 30 :) I will try to do.. thanks dude

  18. Mike
    Mike says:

    I’m trying to figure out how to add a login mechanism to this code. I also want the server to be the one that grants access not the client for obvious reasons. I’m sending the user/pass through the same socket that will be used for communication, yet my program crashes right at the point of asking for the password. User name gets through no problem. I believe it is some kind of connection reset error.

  19. Mike
    Mike says:

    I’m trying to figure out how to add a login mechanism to this code. I also want the server to be the one that grants access not the client for obvious reasons. I’m sending the user/pass through the same socket that will be used for communication, yet my program crashes right at the point of asking for the password. User name gets through no problem. I believe it is some kind of connection reset error.

  20. aredline
    aredline says:

    Best simple code!

    @Bhanusankar Bsc
    The input string in uppercase:
    System.out.println(“Received: ” + clientSentence);
    capitalizedSentence = clientSentence.toUpperCase() + ‘n’;
    outToClient.writeBytes(capitalizedSentence);//response to the client

  21. Rad
    Rad says:

    hi, if you run the client, then type something like “hello world” and then press enter, the server and the client will respond (only obvious if you read the code)

  22. Rad
    Rad says:

    the out put is whatever you type into the client via this line in the code:

    sentence = inFromUser.readLine();
    outToServer.writeBytes(sentence + ‘n’);

  23. Koueik Anthony
    Koueik Anthony says:

    hi i am new in Java and android…my app is not working , i can connect and send data to the server( PC .net server)

    the server send me ” 3 string”

    through your code … i wrote this solution but it is not working :

    while(true){

    try {

    BufferedReader inFromServer = new BufferedReader(new InputStreamReader(sock.getInputStream()));

    message = inFromServer.readLine();

    Toast.makeText(client.this, message,Toast.LENGTH_LONG).show();

    } catch (IOException e) {

    // TODO Auto-generated catch block

    Toast.makeText(client.this, “not working”,Toast.LENGTH_LONG).show();

    e.printStackTrace();

    }

    }

    can you tell me what’s wrong… Please

  24. Noor Nust
    Noor Nust says:

     in this code there are two classes in which it has two main. so how i write this code…

  25. Lefteris
    Lefteris says:

    try moving the while loop just before the message = infromserver.readline().

    your current code creates thousands of inputStreanReaders and bufferReaders.
    also make sure when sending you end your strings with n since you are using the readline method.
    if it still isn’t fixed try after sending calling the .flush() mehod on the dataoutputstream (if such method exists not sure)

Trackbacks & Pingbacks

  1. Dave Drager says:

    New Post: A Simple Java TCP Server and TCP Client http://bit.ly/5L5Kbt

  2. Dave Drager says:

    New blog post: A Simple Java TCP Server and TCP Client http://tinyurl.com/3vt9x9

Comments are closed.