Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Chat, Socket


Автор: hagerds 14.2.2012, 00:12
Всем привет!!!.

пишу чат. его логика работы должна выглядит так:
множество клиентов (использую пока telnet) подключаются к серверу. каждый клиент передаёт в консоль сервера строку.  сервер в свою очередь, при нажатии на кнопку "одному" отсылает сообщение i-му клиенту. клавиша "всем" должна отсылать строку всем подключенным пользователям. 

1)метод getPort() класса Socket возращает удалённый порт. есть ли в api что-то типа setPort()для передачи по удалённому порту, сам искал подходящего не нашел. у кого какие мысли есть по этому поводу?

реализация на клавишу "всем",без статика не работать и пересылается почему-то только последнему, а предыдущий пользователь игнорится.
2)реализация кода по нажатию клавишь хоть правильная? smile  smile  smile может стоит создать по однаму потоку на нажатие каждой кламиши?
Код

import java.awt.FlowLayout;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.Scanner;
import javax.swing.*;


public class ServerTest {
    public ServerTest(){
        JFrame frame = new JFrame("сервер");
        JPanel panel = new JPanel();
        
        JButton button1 = new JButton("одному");
        JButton button2 = new JButton("всем");
        
        button1.addActionListener( new ActionListener(){
        int i =0;
        public void actionPerformed(ActionEvent arg0) {
            
            System.out.println("message!\n{massege"+(++i)+"}\n");
            Chat.out.println("message"+i);
            //???
            
            }});
        button2.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent arg0) {
            //???
        }});
        panel.setLayout(new FlowLayout(FlowLayout.LEFT));
        panel.add(button1);
        panel.add(button2);
        frame.add(panel);
           
        frame.pack();
        frame.setVisible(true);
        
        try {
            
            ServerSocket sock = new ServerSocket(9999);
            int i=0;
            while(true){
                Socket s = sock.accept();
                Thread t = new Chat(s,(++i));
                t.start();
                System.out.println("Клиент "+i);
            }
        } catch (IOException e) {e.printStackTrace();}
    }

    public static void main(String[] args) {
        
        ServerTest st = new ServerTest();
    }
    
}
class Chat extends Thread{
    public Chat(Socket sock,int i){
        this.sock = sock;
        this.i = i;
    }
    public void run(){
        try {
            Scanner in = new Scanner(sock.getInputStream());
            out = new PrintWriter(sock.getOutputStream(),true);
            
            out.println( "Hello! Enter BYE to exit." );
            
            boolean done = true;
            while (done)
            { 
                String str = in.nextLine();
                if (str != null) 
                {
                    out.println("Echo (" + i + "): " + str);
                    System.out.println(sock.toString() + " " + str);
                    if (str.trim().equals("BYE")){
                     done = false;
                  } 
                }
            }
            sock.close();
        } catch (IOException e) {e.printStackTrace();}
    }
    private Socket sock;
    private int i = 0;
    public  PrintWriter out;
}

 
с сокетами и патоками недавно познакомился. успел за это время запутаться и сварить в голове кашу.smile  smile  smile

помогите пожалуста разобраться.  smile  smile  smile 

Автор: LSD 14.2.2012, 14:14
Начни с http://docs.oracle.com/javase/tutorial/networking/sockets/index.html.

Автор: hagerds 16.2.2012, 11:25
проблему решил! надо было всего лишь создать массив клиентских потоков.  smile  smile  smile 
вот код если кому понадобиться smile 
Код

import java.awt.FlowLayout;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.*;


public class ServerTest {
    ServerTest(){
        JFrame frame = new JFrame("сервер");
        JPanel panel = new JPanel();
        
        JButton button1 = new JButton("одному");
        JButton button2 = new JButton("всем");
        
        button1.addActionListener( new ActionListener(){
        public void actionPerformed(ActionEvent arg0) {
            for(Chat client: clientList){
                System.out.println(client.sock.getPort());
            }
            int port = Integer.parseInt(
                    JOptionPane.showInputDialog(
                            "Введите порт i-го клиента!"));
            for(Chat client:clientList){
                if(client.sock.getPort()==port){
                    client.out.println("Server! massege");
                }
            }
            }});
        button2.addActionListener(new ActionListener(){
        int i = 0;
        public void actionPerformed(ActionEvent arg0) {
            i++;
            System.out.println("Server!{massege №"+i+"}\n");
            for(Chat client: clientList){
                client.out.println("Server! massege №"+i);
            }
        }});
        panel.setLayout(new FlowLayout(FlowLayout.LEFT));
        panel.add(button1);
        panel.add(button2);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
        
        try {
            
            ServerSocket sock = new ServerSocket(9999);
            int i=0;
            while(true){
                Socket s = sock.accept();
                t = new Chat(s,(++i));
                clientList.add((Chat) t);
                t.start();
                System.out.println("Вход. Клиент "+i+": "+s.getPort());
            }
        } catch (IOException e) {e.printStackTrace();}
    }

    public static void main(String[] args) {
        new ServerTest();
    }
    
    static ArrayList<Chat> clientList =  new ArrayList<Chat>();
    static Thread t;
}
class Chat extends Thread{
    Chat(Socket sock,int i){
        this.sock = sock;
        this.i = i;
    }
    Socket getSocket(){
        return sock;
    }
    int getIndex(){
        return i;
    }
    
    public void run() {
        try {
            in = new Scanner(sock.getInputStream());
            out = new PrintWriter(sock.getOutputStream(),true);
            
            out.println( "Hello! Enter BYE to exit." );
            
            while (true)
            { 
                String str = in.nextLine();
                if (str != null) 
                {
                    out.println("Echo (" + i + "): " + str);
                    System.out.println("Клиент " + i + ": " + str);
                    if (str.trim().equals("BYE"))
                     break;
                }
            }
        } catch (IOException e) {e.printStackTrace();}
        finally{
            
            in.close();
            out.close();
            try {
                Disconnect(sock.getPort());
                sock.close();
            } catch (IOException e) {e.printStackTrace();}
        }
    }
    
    void Disconnect(int port){
        
        ArrayList<Chat> newList =  new ArrayList<Chat>();
        for(Chat client: ServerTest.clientList){
            if(client.sock.getPort() != port){
                newList.add(client);
            }
        }
        ServerTest.clientList = newList;
        ServerTest.t.stop();
    }
    private Scanner in;
    private int i = 0;
    Socket sock;
    PrintWriter out;
}



и последний вопрос после чего можно закрывать тему.

хочу услышать критику архитектуры кода. не лучше былоб класс  Chat вынести в отдельный файл? и т.д.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)