Задать вопрос
@kykryniks

Чат на Java, отправка сообщения конкретному клиенту, как это сделать?

Доброго времени суток!
Есть код на Java где есть 4ри класса "constant"-определяется порт сервера, "Server"-сервер чата принемает и отправляет сообщения, "Client"-коннектица к серверу принимает и отправляет сообщения "Main"- основной класс который запускает либо сервер либо клиент ( вес код приведен ниже). Все работает прекрасно спасибо автору (автор не я код найден на просторах нета ).
Но есть потребность сделать так что бы можно было выбирать кому посылать сообщение (желательно используя соккеты). Грубо говоря у сервера есть список подключенных клиентов и когда к нему обращаются КЛИЕНТ1 сервер дает только сокет (IP + Port) КЛИЕНТА2 и уже КЛИЕНТ1 и КЛИЕНТ2 общаются без помощи сервера .

PS: Честно я яндекснул и гугланул, но ни чего вразумительного не нашел(((

КОД

package main;  
public abstract class Const {

	public static final int Port = 8309;
	
}


package main;

import java.util.Scanner; 
import server.Server; 
import client.Client; 


public class Main {


	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);

		System.out.println("Работать как Клиент или Сервер? (S(erver) / C(lient))");
		while (true) {
			char answer = Character.toLowerCase(in.nextLine().charAt(0)); 
			if (answer == 's') {
				new Server();
				break;
			} else if (answer == 'c') {
				new Client();
				break;
			} else {
				System.out.println("Fehler");
			}
		}
	}

}


package server;

import java.io.BufferedReader;
import java.io.IOException;   
import java.io.InputStreamReader;  
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import main.Const;


public class Server {

	
	
	private List<Connection> connections = 
			Collections.synchronizedList(new ArrayList<Connection>());
	private ServerSocket server;

	
	public Server() {
		try {
			server = new ServerSocket(Const.Port);

			while (true) {
				Socket socket = server.accept(); 
				
				Connection con = new Connection(socket);
				connections.add(con);
				
				con.start();

			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			closeAll();
		}
	}


	private void closeAll() {
		try {
			server.close();
						
			synchronized(connections) {
				Iterator<Connection> iter = connections.iterator();
				while(iter.hasNext()) {
					((Connection) iter.next()).close();
				}
			}
		} catch (Exception e) {
			System.err.println("Fehler!");
		}
	}

	private class Connection extends Thread {
		private BufferedReader in;
		private PrintWriter out;
		private Socket socket;
	
		private String name = "";
	
	
		public Connection(Socket socket) {
			this.socket = socket;
	
			try {
				in = new BufferedReader(new InputStreamReader(
						socket.getInputStream()));
				out = new PrintWriter(socket.getOutputStream(), true);
	
			} catch (IOException e) {
				e.printStackTrace();
				close();
			}
		}
	

		@Override
		public void run() {
			try {
				name = in.readLine();
				
				synchronized(connections) {
					Iterator<Connection> iter = connections.iterator();
					while(iter.hasNext()) {
						((Connection) iter.next()).out.println(name + " cames now");
					}
				}
				
				String str = "";
				while (true) {
					str = in.readLine();
					if(str.equals("exit")) break;
					
					
					synchronized(connections) {
						Iterator<Connection> iter = connections.iterator();
						while(iter.hasNext()) {
							((Connection) iter.next()).out.println(name + ": " + str);
						}
					}
				}
				
				synchronized(connections) {
					Iterator<Connection> iter = connections.iterator();
					while(iter.hasNext()) {
						((Connection) iter.next()).out.println(name + " has left");
					}
				}
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				close();
			}
		}
	
		
		public void close() {
			try {
				in.close();
				out.close();
				socket.close();
	
				
				connections.remove(this);
				if (connections.size() == 0) {
					Server.this.closeAll();
					System.exit(0);
				}
			} catch (Exception e) {
				System.err.println("Fehler!");
			}
		}
	}
}


package client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

import main.Const;


public class Client {
	private BufferedReader in;
	private PrintWriter out;
	private Socket socket;


	public Client() {
		Scanner scan = new Scanner(System.in);

		System.out.println("IP Adresse (Localhost 127.0.0.1).");
		System.out.println("Format: xxx.xxx.xxx.xxx");

		String ip = scan.nextLine();

		try {
			
			socket = new Socket(ip, Const.Port);
			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			out = new PrintWriter(socket.getOutputStream(), true);

			System.out.println("Имя в чате");
			out.println(scan.nextLine());

			
			Resender resend = new Resender();
			resend.start();

			
			String str = "";
			while (!str.equals("exit")) {
				str = scan.nextLine();
				out.println(str);
			}
			resend.setStop();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close();
		}
	}

	
	private void close() {
		try {
			in.close();
			out.close();
			socket.close();
		} catch (Exception e) {
			System.err.println("Fehler!");
		}
	}


	private class Resender extends Thread {

		private boolean stoped;
		
		
		public void setStop() {
			stoped = true;
		}

		
		@Override
		public void run() {
			try {
				while (!stoped) {
					String str = in.readLine();
					System.out.println(str);
				}
			} catch (IOException e) {
				System.err.println("Fehler");
				e.printStackTrace();
			}
		}
	}

}
  • Вопрос задан
  • 12008 просмотров
Подписаться 4 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Gokudera
java developer
Поддерживаю pi314
Так-то у вас уже на сколько вижу написан и клиент и сервер.
List - сделайте Map и получайте соединение по Id
вместо
Iterator<Connection> iter = connections.iterator();
            while(iter.hasNext()) {
              ((Connection) iter.next()).out.println(name + ": " + str);
            }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы