Доброго времени суток!
Есть код на 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();
}
}
}
}