* Задача от упражнение 5, 2011г.
Публикувано на 13 ноември 2011 в раздел ПИК3 Java.
Да се направят конзолни приложения за чат-сървър и чат-клиент.
Примерно решение:
chatserver/Server.java:
package chatserver;
import java.io.IOException;
import java.io.DataOutputStream;
import java.net.Socket;
import java.util.ArrayList;
public class Server{
private static int port = 1234;
private static ArrayList<Socket> clients = new ArrayList<Socket>(10);
public static void main(String[] args){
ServerListener s = null;
try{
s = new ServerListener(port);
}
catch(IOException e){
System.out.println("Не може да се отвори ServerSocket на порт: "+port);
return;
}
while(true){
try{
Socket clientSocket = s.acceptConnection();
clients.add(clientSocket);
new ServerThread(clientSocket);
}
catch(IOException e){
System.out.println("Неуспешно свързване на клиент...");
}
}
}
static void sendToAll(String message){
synchronized(clients){
for(int i=0; i<clients.size(); i++){
try{
DataOutputStream cos = new DataOutputStream(clients.get(i).getOutputStream());
cos.writeUTF(message);
cos.flush();
}
catch(IOException e){
System.out.println("Не мога да изпратя съобщение...");
}
}
}
}
static void removeClient(Socket c){
synchronized(clients){
System.out.println("Премахвам клиент "+c);
clients.remove(clients.indexOf(c));
try{
c.close();
}
catch(IOException e){
System.out.println("Не мога да затворя връзка с клиент");
}
}
}
}
chatserver/ServerListener.java:
package chatserver;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerListener{
private ServerSocket servSock;
public ServerListener(int port) throws IOException{
servSock = new ServerSocket(port);
System.out.println("Сървърът е стартиран и слуша на порт: "+port);
}
public Socket acceptConnection() throws IOException{
Socket s = this.servSock.accept();
System.out.println("Нов клиент "+s.toString());
return s;
}
}
chatserver/ServerThread.java:
package chatserver;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
public class ServerThread extends Thread{
private Socket sock;
DataOutputStream os;
public ServerThread(Socket sock){
this.sock = sock;
this.start();
}
public void run(){
DataInputStream in;
String message;
try{
in = new DataInputStream(this.sock.getInputStream());
while(true){
message = in.readUTF();
if(message.equals("BYE")){
break;
}
else{
System.out.println(message);
Server.sendToAll(message);
}
}
}
catch(IOException e){
System.out.println("Проблем с предаване на данни до "+this.sock.toString());
}
finally{
Server.removeClient(this.sock);
}
}
}
chatclient/Client.java:
package chatclient;
import java.util.Scanner;
import java.io.IOException;
public class Client{
public static void main(String[] args){
String host = "localhost";
int port = 1234;
String name = "Петър";
Scanner keyboardIn = new Scanner(System.in);
ClientThread c = new ClientThread(host, port);
String messageOut;
while(true){
messageOut = keyboardIn.nextLine();
if(messageOut.equalsIgnoreCase("exit")){
c.sendMessage("BYE");
c.interrupt();
break;
}
else c.sendMessage(name+" каза: "+messageOut);
}
try{
c.close();
System.out.println("Успешен изход от системата");
}
catch(Exception e){
System.out.println("Проблем при прекратяването на връзка");
}
}
}
chatclient/ClientThread.java:
package chatclient;
import java.net.Socket;
import java.io.DataOutputStream;
import java.io.DataInputStream;
import java.io.IOException;
public class ClientThread extends Thread{
private Socket socket;
private DataOutputStream out;
private DataInputStream in;
public ClientThread(String host, int port){
try {
this.socket = new Socket(host, port);
System.out.println("Свързах се с "+socket);
this.in = new DataInputStream(this.socket.getInputStream());
this.out = new DataOutputStream(this.socket.getOutputStream());
// Стартиране на нишката, която очаква получаване на съобщения
this.start();
}
catch(IOException e){
System.out.println("Не мога да се свържа със сървъра");
}
}
public void run(){
try{
while(true){
System.out.println(this.in.readUTF());
}
}
catch(IOException e){
System.out.println("Прекратяване на нишката поради невъзможност за четене");
this.interrupt();
}
}
void sendMessage(String message){
try{
this.out.writeUTF(message);
this.out.flush();
}
catch(IOException e){
System.out.println("Не мога да изпратя съобщението");
}
}
void close() throws IOException{
if(this.in!=null) in.close();
if(this.out!=null) out.close();
if(this.socket!=null) socket.close();
}
}
Допълнителна задача: Реализирайте функционалност за предаване на лични съобщения между различни потребители. За целта запазете имената на клиентите и на сървъра и когато например някой клиент подаде съобщение от типа "/msg Petar abcdefg", то на потребител с име "Petar" ще бъде подадено съобщението "abcdefg" (вместо да бъде разпратен целия String на всички).
Добави коментар