Prosta aplikacja klient serwer. problem z odczytem danych

0

Witam. Próbuję napisać bardzo prosty programik klient-serwer, dzięki któremu chciałem ogarnąć podstawy pisania tego typu aplikacji. Napisałem sobie coś takiego, że mam jakąś tam osobę, potem listę osób, która ma być jako taka prosta książka adresowa. Napisałem sobie prostą klasę serwera i klienta ale mam problem z przesłaniem żądania wykonania jakiegoś zadania z klienta. Z tego co udało mi się ustalić to klient umieszcza żądanie w buforze a przy odczycie go na serwerze jest problem. W miejscu gdzie odczytywany jest ten bufor program całkowicie się zawiesza. Zawiesza w takim sensie, że nie wykonuje dalej poleceń tylko tak jakby czytał cały czas ten bufor. Z góry sorka za jakość kodu ale ogólny szkielet był z jakiegoś tam tutoriala i po tym jak miało to już zadziałać to chciałem to jakoś pozmieniać i ulepszyć.

Oto co udało mi się popełnić :D

package CliSer.test1;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.Scanner;

class Person{
	private String name;
	private String surname;
	
	private String address;
	
	public Person(String n, String s, String a){
		this.name = n;
		this.surname = s;
		this.address = a;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSurname() {
		return surname;
	}

	public void setSurname(String surname) {
		this.surname = surname;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}
	
	public String toString(){
		return "Name: " + this.name + " Surname: " + this.surname + " Address: " + this.address;
	}
	
}


class PersonList{
	private LinkedList<Person> list;
	
	public PersonList(){
		this.list = new LinkedList<>();
	}
	
	public void addPerson(String n, String s, String a){
		Person newPerson = new Person(n, s, a);
		list.add(newPerson);
	}
	
	public void removePerson(String n, String s, String a){
		Iterator<Person> it = list.iterator();
		
		Person temporaryPerson = null;
		
		while(it.hasNext()){
			temporaryPerson = it.next();
			if(temporaryPerson.getName().equals(n) && temporaryPerson.getSurname().equals(s) && temporaryPerson.getAddress().equals(a))
				it.remove();
		}
	}
	
	public void editPerson(String n, String s, String a){
		Iterator<Person> it = list.iterator();
		Scanner input = new Scanner(System.in);
		
		Person temporaryPerson = null;
		
		while(it.hasNext()){
			temporaryPerson = it.next();
			if(temporaryPerson.getName().equals(n) && temporaryPerson.getSurname().equals(s) && temporaryPerson.getAddress().equals(a)){
				System.out.println("Enter new name: ");
				temporaryPerson.setName(input.nextLine());
				System.out.println("Enter new surname: ");
				temporaryPerson.setSurname(input.nextLine());
				System.out.println("Enter new address: ");
				temporaryPerson.setAddress(input.nextLine());
			}
		}
		input.close();
	}
	
	public String printList(){
		String result = "";
		
		Iterator<Person> it = list.iterator();
		
		result = "Person List:\n";
		while (it.hasNext()) {
			result = it.next() + "\n";
		}
		
		return result;
	}
}
package CliSer.test1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.regex.Pattern;


public class Server{
	private String hostName;
	private int port;
	private ServerSocket servSock;
	private BufferedReader in;
	private PrintWriter out;
	
	private PersonList list;
	
	private Pattern requestPattern = Pattern.compile(" ", 4);
	
	public Server(String host, int aPort){
		this.hostName = host;
		this.port = aPort;
		this.list = new PersonList();
	}
	
	public void connectServer(){
		InetSocketAddress iSA = new InetSocketAddress(hostName, port);
		try {
			servSock = new ServerSocket();
			servSock.bind(iSA);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	public void disconnectServer(){
		try {
			in.close();
			out.close();
			servSock.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void connectionServer(){
		boolean serverRunning = true;
		
		while(serverRunning){
			try {
				Socket connection = servSock.accept();
				System.out.println("Connection established");
				serviceRequests(connection);
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		}
	}
	
	private void serviceRequests(Socket connection){
		try {
			
			in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
			out = new PrintWriter(connection.getOutputStream(), true);
			System.out.print("R: ");
			System.out.print("Server Request: " + in.readLine());
			System.out.print("E: ");
			
			//System.out.println(in.readLine());
			for(String line; (line = in.readLine()) != null;){
				//String respond;
				String[] request = requestPattern.split(line, 4);
				String command = request[0];
				if(command.equals("add")){
					System.out.println("Add dzialen");
					if(request.length!=4)
						writeRespond("Wrong number of elements; method: add");
					else{
						list.addPerson(request[1], request[2], request[3]);
						writeRespond("Added person");
					}
				}
				if(command.equals("remove")){
					if(request.length!=4)
						writeRespond("Wrong number of elements; method: remove");
					else
						list.removePerson(request[1], request[2], request[3]);
				}
				if(command.equals("edit")){
					if(request.length!=4)
						writeRespond("Wrong number of elements; method: edit");
					else
						list.editPerson(request[1], request[2], request[3]);
				}
				if(command.equals("print")){
					if(request.length!=1)
						writeRespond("Wrong number of elements; method: print");
					else{
						String result =	list.printList();
						writeRespond(result);
					}
				}
				
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			this.disconnectServer();
		}
		
	}
	
	private void writeRespond(String message){
		if(message!=null)
			out.println(message);
		else
			out.print("Error");
	}
	
	public static void main(String[] args){
		String hostName = "localhost";
		int port = 14009;
		
		Server server = new Server(hostName, port);
		server.connectServer();
		server.connectionServer();
		server.disconnectServer();
	}
	
}
package CliSer.test1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client{
	private Socket socket = null;
	private PrintWriter out = null;
	private BufferedReader in = null;
	
	public Client(String hostName, int port){
		try {
			socket = new Socket(hostName, port);
			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			out = new PrintWriter(socket.getOutputStream());
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private void makeRequest(String request){
		String respond;
		//System.out.print("Client Request: " + request);
		try {
			out.println(request);
			respond = in.readLine();
			System.out.print(respond);
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	public void closeConnection(){
		try {
			in.close();
			out.close();
			socket.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args){
		String hostName = "localhost";
		int port = 14009;
		Client client = new Client(hostName, port);
		
		client.makeRequest("add p1 p1 p1");
		client.makeRequest("add p2 p2 p2");
		client.makeRequest("add p3 p3 p3");
		client.makeRequest("add p4 p4 p4");
		client.makeRequest("add p5 p5 p5");
		
		client.makeRequest("print");
	
		client.closeConnection();
	}
}
0

Ma ktoś jakieś pomysły?

0

for(String line; (line = in.readLine()) != null;) - readLine() jest opearcją blokującą - jeżeli strumień jest pusty to nie zwraca nulla tylko czeka aż coś się pojawi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1