Socket Probleme mit einfacher Socketverbindung

montana

Neues Mitglied
Hallo,
Als Hausaufgabe muss ich ein einfaches server-Programm schreiben das Verbindungsanfragen
über TCP entgegen nimmt und eine übermittelte Zahl um eins inkrementiert und zusammen mit einem Zufalls String zurückgibt. Außerdem soll das Programm in der Lage sein mehrere Clients gleichzeitig zu bedienen.
Leider macht mein Programm nicht zu 100% das was ich von ihm erwarte und ich finde den Fehler einfach nicht.
Wäre nett wen hier mal jemand drüber gucken könnte.

Code:
import java.io.*;
import java.net.*;

public class RandomClient 
{

	public static final int PORT = 4432;
	public static final String HOST = "127.0.0.1"; 



	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException 
	{

		einlesen();
		Socket socket = new Socket(HOST, PORT);
		PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
		BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		String userInput;
		while((userInput = String.valueOf(einlesen())) != null)
		{
			out.println(userInput);
			System.out.println(in.readLine());
		}

		socket.close();
		out.close();
		in.close();


	}
	
	/**
	 * Liest einen Integerwert von der konsole ein
	 * @return den eingegebene Int Wert
	 * @throws IOException
	 */
	private static int einlesen() throws IOException 
	{
		InputStreamReader input = new InputStreamReader(System.in);
		BufferedReader reader = new BufferedReader(input);
		int i = 0;
		System.out.print("Zahl eingeben: ");

		try
		{
			i = Integer.parseInt(reader.readLine());
		}
		catch (NumberFormatException e)
		{
			System.out.println("Bitte nur Zahlenwerte");

		}
		return i;
	}

}

Code:
import java.io.*;
import java.net.*;

/**
 * Das Server Programm
 * @author master
 *
 */
public class RandomServer 
{

	public static final int PORT = 4432;


	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException 
	{
		// TODO Auto-generated method stub
		ServerSocket serverSocket = new ServerSocket(PORT);
		ServerThread serverThread = null;
		Socket socket = null;

		while(true)
		{
			socket = serverSocket.accept();

			serverThread = new ServerThread(socket);
		}
	}

}


Code:
import java.io.*;
import java.net.*;

public class ServerThread extends Thread
{

	private Socket socket = null;

	public ServerThread(Socket socket) 	
	{
		this.socket = socket;
		this.start();
	}

	public static String zufallsStringErzeugen()
	{

		String zufallsString = "";
		MeinRandom random = new MeinRandom();
		int anzahl = random.nextInt(1, 20);

		for(int i =1;anzahl >= i; i++){
			char pass = (char)random.nextInt(65,90);
			/*System.out.println(i + pass);*/
			zufallsString = zufallsString + String.valueOf(pass);
		}

		return zufallsString;
	}

	public void run()
	{
		try
		{
			BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
			String line;
			while((line = in.readLine()) != null)
			{
				int i = Integer.parseInt(line);
				i++;
				out.println(zufallsStringErzeugen() + i);
			}
			out.close();
			socket.close();
			in.close();
			//serverSocket.close();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}	
	}	
}

Teilweise funktioniert das Programm aber die erste anfrage wird vom Server nicht beantwortet, jede weitere dann schon.
Außerdem bekomme ich eine exception

Code:
java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(Unknown Source)
        at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
        at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
        at sun.nio.cs.StreamDecoder.read(Unknown Source)
        at java.io.InputStreamReader.read(Unknown Source)
        at java.io.BufferedReader.fill(Unknown Source)
        at java.io.BufferedReader.readLine(Unknown Source)
        at java.io.BufferedReader.readLine(Unknown Source)
        at ServerThread.run(ServerThread.java:38)
 
Hast du ein Glück 😀 War grad in der Stimmung dir mal was zu basteln...
Sollte voll funktionsfähig sein...

Der Client:
Java:
package com;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

/**
 *
 * @author Christopher Probst
 */
public class Client {

    public static final int PORT = 4432;
    public static final String HOST = "127.0.0.1";

    public static void main(String[] argv) throws IOException {
        //Socket öffnen und verbinden
        Socket socket = new Socket(HOST, PORT);

        //Data stream öffnen...
        DataInputStream dis = new DataInputStream(socket.getInputStream());

        //Iwie muss das ja auch wieder raus...
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());

        //Hier speichern wir gleich die Zahl
        int zahl;

        //Einlesen und einfach als 4-Byte int verschicken!
        dos.writeInt(zahl = einlesen());

        //Nun das Resultat einlesen
        int umEinsErhoehteZahl = dis.readInt();

        //String es fehlt noch der Zufallstring!
        String totalZufaelligerString = dis.readUTF();

        //Reicht aus! Alle Stream werden intern geschlossen!
        socket.close();

        //Noch kurz nen schlauen Kommentar auf der Konsole ausgeben...
        System.out.println("Alte Zahl: " + zahl
                + " | Empfangene Zahl: " + umEinsErhoehteZahl
                + " | Zufälliger String: " + totalZufaelligerString);
    }

    /**
     * Liest einen Integerwert von der konsole ein
     * @return den eingegebene Int Wert
     * @throws IOException
     */
    private static int einlesen() throws IOException {
        InputStreamReader input = new InputStreamReader(System.in);
        BufferedReader reader = new BufferedReader(input);
        int i = 0;
        System.out.print("Zahl eingeben: ");

        try {
            i = Integer.parseInt(reader.readLine());
        } catch (NumberFormatException e) {
            System.out.println("Bitte nur Zahlenwerte");

        }
        return i;
    }
}

Der Server:
Java:
package com;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.UUID;

/**
 *
 * @author Christopher Probst
 */
public class Server {

    public static final int PORT = 4432;

    private static final class ClientWorker implements Runnable {

        //Der socket...
        private final Socket socket;
        private final DataOutputStream dos;
        private final DataInputStream dis;

        public ClientWorker(Socket socket) throws IOException {
            this.socket = socket;

            //Output
            dos = new DataOutputStream(socket.getOutputStream());

            //Input
            dis = new DataInputStream(socket.getInputStream());

            //Thread erstellen und starten
            new Thread(this).start();
        }

        @Override
        public void run() {

            try {
                //Ursprung einlesen
                int ursprung = dis.readInt();
                
                //Erhöhen um 1
                ursprung++;
                
                //Ist wirklich schon super zufaellig...
                String zufaelligerGehtsNicht = UUID.randomUUID().toString();
                
                //Zurück schicken aber diesmal + 1
                dos.writeInt(ursprung);
                
                //Den string noch schnell als utf schicken
                dos.writeUTF(zufaelligerGehtsNicht);
                
                //Brav alles schliessen
                socket.close();
            } catch (IOException e) {
                //Soll ja ab und an mal vorkommen :D
                e.printStackTrace();
            }
        }
    }

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        ServerSocket serverSocket = new ServerSocket(PORT);

        while (true) {
            //Eine Zeile ... :D
            new ClientWorker(serverSocket.accept());
        }
    }
}

Fertig!


Nutze das alles nach freiem Belieben 😉

Gruß,

Chris
 

Neue Themen


Zurück
Oben