Java Socket - Client-server Communication Stuck With Multi-threading
Feb 6, 2015
Firstly, my code is just a demo of my multiplayer game (2 or more players can play simultaneously) to demonstrate my problem without any extra things. I have successfully implemented peer-to-peer (P2P) communication in my game. Later, I decided to add support for client-server communication (ie a central server which is also a player) in my game. It should be much easier than P2P. Now here is the problem:
Suppose, I have 1 server and some clients (may be 1 or more clients). They all should give the following output:
Starting...
A
B
C
E
F
...
...
Done!
They all give the above output without using multi-thread. But using multi-threading, it gives the above output only when there're 1 server and 1 client. I'm using 2 threads (1 for sending, 1 for receiving) for each Socket. That means, each client has only 2 threads for communication but the server has (2 * totalClients) threads.
I've attached my full test project. So, here I'm only showing my 2 thread classes.
ReceiveThread class:
class ReceiveThread extends Thread {
private ObjectInputStream receiveStream;
private BlockingQueue<Character> queue = new ArrayBlockingQueue<Character>(Common.totalClients);
[Code] ....
Since I've attached my full test project, I'm not showing the other 3 classes. They are ServerMain, ClientMain and Common. If I've 2 clients to be connected, then I get the following output:
Server: (Runs first)
Starting...
A
Client 1 (clientID is 1): (Runs after the server)
Starting...
A
B
B
Client 2 (clientID is 2): (Runs after Client 1)
Starting...
A
They are stuck at there, even no exception. Actually, the server and the clients are stuck at the line try { ch = queue.take(); } if more than 1 client are connected. It seems that all are trying to receive data. But without using the dedicated threads, they all work as expected even for more than 1 client. Why is this behaviour? How to solve it? Note that I have used the same SendThread and ReceiveThread classes by which I have succcessfully implemented P2P communication.
About my attached test project file:
It has 5 small .java files for the classes as stated above. It is currently faulty when using additional threads. You have to change clientID variable for each client (they are described inside). But it works as expected without additional threads. To test it without the additional threads:
Comment " TODO" linesUncomment the single lines just after " TODO" linesComment the additional thread construction lines (4 lines)
Currently, for a workaround, I'm not using the dedicated threads for sending and receiving data only for client-server communication in my multi-player game. But I'm still using these threads for P2P communication. I don't know why it is and how to solve it.This is the attached test project file as described above.
Attached File(s) : Test Project.zip (4.11K)
View Replies
ADVERTISEMENT
Dec 26, 2014
I have been practicing writing java code, my university course is going to cover socket programming and multi-threading.
I am presently just starting to write myself a framework for all multiplayer games I may make in the future, my aim really is simply to practice and understand better and this time, im not using an ide, just sublime text, all new grounds for me, I have a good basic understanding of the subject but I want to be fluent.
import java.net.*;
import java.util.ArrayList;
import java.io.*;
/*SMOOTH THREAD SAFE MULTI CLIENT HANDLING CLASS.
*
*This class will create connection objects when a connection is detected, these connections will run in a separate thread and update an array list in their parent class containing their last sent data
[Code] .....
View Replies
View Related
Jul 22, 2014
So we have a Client and Server. Client opens a socket to Server, server initiates new Thread to handle the communication with client. Is there a way to be singnalled when there is input on socket, so I don't have to use infinite while loop solution?
View Replies
View Related
Sep 16, 2014
Any example of client/server socket based application using Spring and Maven where application do the following
Client sends a request with a path to any file on the server
„h Server reads the file and responds back with the content
„h Client outputs the content to the console
I am trying to follow this [URL] ....
I am using java 6
View Replies
View Related
Nov 16, 2014
Is there any specific name for servlet's multi threading mechanism? I mean any technical term for it.
View Replies
View Related
Feb 2, 2015
I have a problem with multi threading calling with for loop. I have those two and many other classes in one jar file but n 2 different packages.
When i execute the jar file first runs the Aclass, from where i try to run multi threads. From the run() of the class RunTheGame i call many other classes which are in the same package. Like you can see from the for loop is executed the threads.
The problem is that when the second thread starts the first one is stopped this happens for all the threads, more simply when a new thread starts the old one is dead.
It seems that liken the threads uses the classes called from run() of the class RunTheGame as non multi threaded. It gives this error:
Java Code:
Exception in thread "Thread-0" java.lang.NullPointerException
at thePackage2.EClass.getWhiteRemaining(EClass.java:49)
at thePackage2.EClass.isFinal(DClass.java:84)
at thePackage2.Spiel.<init>(Cclass.java:76)
at thePackage2.RunTheGame.run(RunTheGame.java:198)
at java.lang.Thread.run(Thread.java:745) mh_sh_highlight_all('java');
All the above refereed classes are called from the from run() of the class RunTheGame . Like i understand all the threads use those classes as non thread autonomous classes.
Java Code:
public class Aclass {
private static Thread t[];
public static void main(String[] args) throws IOException {
for (int Game = 0; Game< 10; Game++) {
t[Game] = new Thread(new thePackage2.RunTheGame(aplayer, bplayer, Name, ID , Pmach));
t[Game].start();
[Code] .....
View Replies
View Related
Jul 9, 2014
Just some questions regarding a Consumer producer program I am not understanding. Here are the two classes Below and my questions are :
1. In the main method for NamedConsumer, we created an instance of the class and call it "consumer" and we start it. Then we create another instance and we give its reference to the same variable. Doesn't this in turn destroy the original reference of the first instance we created which was started? Could we have done
NamedConsumer consumer1 = new NamedConsumer( "One", producer );
new Thread( consumer1 ).start();
NamedConsumer consumer2 = new NamedConsumer( "Two", producer );
new Thread( consumer2 ).start();
2. we called start on two difference instances of the NameConsumer class. Doesn't the "run" method need to be synchronized since two threads are hitting it?
Producer.Java
Java Code: public class Producer implements Runnable
{
static final int MAXQUEUE = 5;
private List<String> messages = new ArrayList<String>();
public void run() {
while ( true ) {
putMessage();
try {
Thread.sleep( 1000 );
[code]...
View Replies
View Related
Feb 14, 2014
I have been trying for days and nights , no compile error , but alot of NPEs error .......
This is my Test program
import java.util.*;
public class Test
{
public static void main (String[]args)
{
int totalShares = 0 ;
double totalCost = 0.0;
double totalProfitLoss = 0.0;
[Code] ....
I am expecting a output like this (Which I have error running:
Tracking of Stock : FCS
8 shares has been brought at $37.61
Total shares now 8 at total cost $300.88
33 shares has been brought at $36.31
Total shares now 41 at total cost $1499.11
17 shares has been sold at $42.67
Total shares now 24 at total cost $773.72
19 shares has been sold at $32.31
Total shares now 5 at total cost $159.83
31 shares has been brought at $33.85
Total shares now 36 at total cost $1209.18
28 shares has been brought at $36.37
Total shares now 64 at total cost $2227.54
20 shares has been brought at $35.49
Total shares now 84 at total cost $2937.34
At $36.00 per share, profit is $86.66
View Replies
View Related
Apr 26, 2014
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class M_serverApp extends javax.swing.JFrame implements Runnable {
[Code] ....
View Replies
View Related
Apr 26, 2014
Server:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class M_serverApp extends javax.swing.JFrame implements Runnable {
ServerSocket server = null;
[Code]...
View Replies
View Related
Apr 3, 2014
I'm working on an assignment right now which involves passing a variable series of numbers to the Server to be sorted into the correct order and returned to the client.
So far I have it connecting to the server and asking for my numbers, and I am entering each number and pressing return, and it is accepting each number individually.
One (smaller I think) problem i'm having is with the client code, specifically the while loop.. I've tried to code it so that when I enter a full stop ('.') the program will stop asking me for more numbers and move on to sending them to the server.. but instead it just crashes giving an error.. heres an example
"Enter a number: 1
Enter a number: 3
Enter a number: 2
Enter a number: 1.
java.lang.NumberFormatException: For input string: "1."
at java.lang.NumberFormatException.forInputString(Num berFormatException.java:65)
[Code] ....
Here's the client code in full
package numberSortprogram;
import java.io.*;
import java.net.ServerSocket;
public class NumSortClient {
public static void main(String[] args) {
InputStreamReader is = new InputStreamReader(System.in);
[Code] ....
The big problem that I have is figuring out how to send the sorted array back to the client..
So, what im trying to get to happen is-
-Client is asked to enter numbers
-Client enters series of numbers into an array
-Array is converted to a string and sent to the server
-String is then split into an array of strings and sorted using compareTo (don't know if this is the best way?)
-Sorted array is sent back to client and displayed.
fyi this is making use of streamsockets..
All of the rest of my code is below:
package numberSortprogram;
import java.io.IOException;
import java.net.*;
import java.util.regex.PatternSyntaxException;
public class NumSortServer {
public static void main(String[] args) {
int serverPort = 4444; // default port
if (args.length == 1 )
[Code] .....
View Replies
View Related
Apr 18, 2014
I am currently writing two java classes (client and server). The client takes an input number form keyboard and sends it to the server. The server then multiplies this number by two and sends it back to the client. The numbers should also be printed to screen along the way, for example if I input the number 3 I should get
"From Client: 3" "From Server: 6"
They should continuously do this unless a negative number is received by the client, say for example the number -3 is sent to the server and it returns -6.
The code I have for the two classes so far is:
import java.io.*;
import java.net.*;
import java.nio.ByteBuffer;
import java.util.Scanner;
class Client {
public static void main(String args[]) throws Exception {
DatagramSocket clientSocket = new DatagramSocket();
[Code] .....
Currently, when I run the program all I get is an output of the number first entered. I am aware it requires a loop but I don't know where and what the condition should be.
Also if I wanted to adapt this so that it would take the integer from client and subtract two at the server and return to client who sends back to server to keep subtracting two unless it reaches a negative number at which point the client will terminate the program - how might I do this.
I do realise there needs to be a while loop in the above code, but I wanted to test it sent the number from client to server and its not doing it. All I get is a print screen of 'enter number' and then the number I enter.
View Replies
View Related
Apr 18, 2014
I worked on this simple client server chat app and it worked now for my project i needed to work on client server audio streaming broadcast but i dont really know much bout audio api and methods on java...
View Replies
View Related
Mar 9, 2013
I am using EJB (Stateless) without any web service. I simply need to send a String from Client to Server
I can connect any Java SE Client with this EJB. But how I can connect an Android Client with this EJB (i.e. Using EJBRemote Interface) directly? I am using :
Glassfish Application Server
Netbeans IDE
View Replies
View Related
Jul 19, 2012
How to get the client windows login name in server using JAVA those who access the site? I used the following code, but im getting only local machine name . getRemoteUser() is returning null value. I am using tomcat server. Is there anything to do with windows IIS configuration??
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String clientIP = request.getRemoteAddr();
//
// Get client's host name
//
String clintHost = request.getRemoteHost();
[Code] ....
View Replies
View Related
Mar 9, 2014
I have made a server/multi Clients where Clients send Double data but my problem is that the clients send this data to Server only wonce, and the server waits again the connection from client. (I have to run the clients manually each time)what i'm looking: the client should always send data to server. like an infinite loop.
View Replies
View Related
Feb 21, 2014
I need to authenticate my client java application using ADFS enabled Sharepoint server.
View Replies
View Related
May 28, 2013
I have some embedded systems (with web server) putting their states, sensor values into an XML file.
<sensor1>
<temp>21.4</temp>
<unit>°C</unit>
</sensor1>
Now I played a little with EJB3. I want to start a timer bean in a 10second interval which retrieves the IP of registered devices from a databases, opens client sockets with a Thread Pool and retrieves the XML file over HTTP GET of each device listed in the db.
Is it possbile with EJB3? how to start thread based background services like that within EJB3 timer bean?
View Replies
View Related
Nov 3, 2014
I'm having a lot of problems reading data from a socket. I'm trying to read the responses of a python server. I've a
BufferedReader inputStream = new BufferedReader( new InputStreamReader(socket.getInputStream()));
And then:
char[] messageChunk=new char[32768]; //32768
List<Byte> messageBytesList = new ArrayList<Byte>();
while (inputStream.ready()) {
inputStream.read(messageChunk, 0, 32768);
for(int k=0;k<32768;k++){
messageBytesList.add((byte)messageChunk[k]);
}
}
inside a thread. Then I convert the list of bytes to a byte array using:
Byte[] messageBytes = messageBytesList.toArray(new Byte[messageBytesList.size()]);
byte[] message = ArrayUtils.toPrimitive(messageBytes);
The problem is that I often receive ArrayOutOfBound errors when I try to parse the byte array. I think that I'm reading from the socket in a wrong way..
View Replies
View Related
Dec 3, 2014
What is the difference between instansiating a ServerSocket and .accept(); and a ServerSocketChannel .accept();
They both listen on a port for incoming connections so what is the benifit or dissadvantage of ServerSocketChannel?
View Replies
View Related
Oct 22, 2014
I am attempting to test a TCP Client and Server for an assignment I am doing in class. The goal here is to "test your client and Server applications by transferring (i) a file having 10,000+ lines (see supplied big-file1.txt having 12000+ lines), (ii) a file having 20,000+ lines (you may create one of your own from big-file1.txt, or obtain a large size file from the Google website at [URL] ...). Then, compute and display the total transfer time of the files at both of the sides separately (your choice in millisecond/second)."
I have created the TCPClient and TCPServer java classes, ran the server first and then the client, and using mathematical formulas to calculate the transfer time. Trouble is, I'm having trouble testing the client and server in the file area and not the area where I had to input a line, let the server print it, and then have the client eliminate the articles from the line. I need testing the file. Here is my code so far:
TCPClient:
package tcpclient;
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
String sentence;
[code] ....
How to fix the code so that the time in seconds does not output as 60 for both files and that the files go through the exchange?
View Replies
View Related
Apr 20, 2015
I have a program using Pipe line to exchange the infomation in the Client-Server model. Can I separate out main function and then put into Server main and Client main?
//PipeEchoServer
public class PipedEchoServer extends Thread {
PipedInputStream readPipe;
PipedOutputStream writePipe;
PipedEchoServer(PipedInputStream readPipe, PipedOutputStream writePipe){
this.readPipe = readPipe;
[code]....
View Replies
View Related
Feb 17, 2014
I have to develop a code in parallel which is implemented in sequential yet. How to add the server client relation in the program so that work can be divided into multiple clients.
View Replies
View Related
Apr 2, 2014
I've just recently started playing around with network programming in Java, and I've come up with a simplistic server than can handle multiple clients and return the IP and port each one is connected to (or I'm under the impression that is so). What I've been requested to do as an exercise by one of the programming teachers at my high school (I'm not in a class, this is my own time) is send a message from one client to the other through the ServerSocket so that it may "watch" everything going on. I'm not sure how to go about this at all.
EDIT : now it never seems to go the the else or else if statements...
That is now the main problem. It never, ever, goes past the first if statement, no matter what it is.
EDIT : Okay, I haven't changed a line of code but suddenly not a single if statement is working. They just stopped. The client simply hangs and I can't type anything.
Server
public class Server implements Runnable {
Socket clientSocket;
Server(Socket clientSocket) {
this.clientSocket = clientSocket;
}
public static void main(String args[]) throws Exception {
ServerSocket ssock = new ServerSocket(3480);
System.out.println("Listening on port 3480");
[code]....
View Replies
View Related
Sep 3, 2014
I have a problem on how to make my client to send the object to a server.
So I have one interface called "RMIInterface" and client "RMIClient" and server "RMIServer":
RMIInterface
interface RMIInterface {
public String getMessage(String text) throws RemoteException;
}
RMIClient
public class RMIClient {
[code]....
With this program I can connect to a Server with a Client, and print in Client console a message.But, how can I send message from a client to a server, and print that message in server console output?
make the simpliest example with sending a message to a server, edit inteface header code to public interface RMIInterface extends Remote, I forgot to add.
View Replies
View Related
Apr 6, 2014
I want to ask that, when a server listen to A port and it accepts a request from a client then the server accepts the request using accept method,but how does the server get the info about the client like wat is the port no and ip address of the client,I read a answer regarding this that Server never gets the port no of client only the ip address and it connects to client using a connection stream but as far I know from networking, a device must have the ip address and port no of the device it wants to connect to.
View Replies
View Related