Мне хочется сделать историю для чата, но как-то с первого раза самому не вышло. Ситуация такая: есть сервер, есть много клиентов (например штук 10) с ними со всеми сервер поддерживает соединение. Кто-то из клиентов отправляет сообщение на сервер, сервер сохраняет сообщение в историю и рассылает историю(ну или часть её) всем клиентам. Но сервер может послать сообщение клиенту только после того как клиент что-то прислал (я это так понимаю, поправьте если неверно), вот и получается, что клиенты должны постоянно отсылать проверочные запросы серверу (мол вдруг что поменялось), если есть изменения, то клиенты получают это изменения (новые сообщения из истории). Я так понимаю на стороне клиента создается поток, который отправляет проверочные сигналы серверу (параллельно с сообщениями от этого клиента). Если это так, то мог бы кто-нибудь написать пример этого потока, т.е. что в нём должно быть и когда должен объявляться. Мои мысли: Код | Thread t=new Thread(new Runnable() { @Override public void run() { out.write(/*something*/); String history=in.read(); } });
|
Сам чат: Код | public class Server { static String history=""; static ArrayList<User> users=new ArrayList<>(); static Connection conn = null; public static void send(String input) { for(int i=0;i<users.size();i++)users.get(i).send(); } public static void main(String[] args) { ServerSocket s=null; try{ int i=0; s=new ServerSocket(8189); System.out.println("Server is started"); while(true) { User u=new User(i,s.accept()); u.start(); users.add(u); i++; System.out.println(i); } } catch(IOException e) { System.out.println("init error: "+e); } finally { if(s!=null) { try { s.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }
|
Код | public class User extends Thread{ Socket s; int num; InputStream is; OutputStream os; BufferedReader br; PrintWriter out; int count=0; public User(int i,Socket s) { num=i; this.s=s; } public void run() { try {
BufferedReader in = new BufferedReader( new InputStreamReader(s.getInputStream())); out = new PrintWriter(s.getOutputStream(), true);
out.println("Hello, you are client #" + num + "."); out.println("Enter a line with only a period to quit\n");
while (true) { String input = in.readLine(); Server.history=Server.history+" "+input; if (input == null || input.equals(".")) { break; } Server.send(); } } catch (IOException e) { log("Error handling client# " + num + ": " + e); } finally { try { s.close(); } catch (IOException e) { log("Couldn't close a socket, what's going on?"); } log("Connection with client# " + num + " closed"); } }
private void log(String message) { System.out.println(message); } public void send() { out.println(Server.history); } }
|
Клиент Код | public class Klient { public static void main(String[] args) { new SwingView(); } }
|
Код | public class SwingView { JButton send; JButton connect; JTextArea server; JTextField message; JFrame frame; JTextArea history; private BufferedReader in; private PrintWriter out; public SwingView() { frame=new JFrame("клиент"); send=new JButton("отправить"); connect=new JButton("соединение"); server=new JTextArea("127.0.0.1/8189"); message=new JTextField("сообщение"); history=new JTextArea(); frame.setSize(400,400); JPanel panel=new JPanel(); panel.setLayout(new GridLayout(2, 2)); panel.add(server); panel.add(connect); panel.add(message); panel.add(send); Box box=new Box(BoxLayout.Y_AXIS); box.add(panel); box.add(history); frame.add(box,BorderLayout.NORTH); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); connect.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { super.mousePressed(e); start(); } }); send.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { send(); } }); } public void start() { try { Socket s = new Socket(getHost(), getPort()); in = new BufferedReader( new InputStreamReader(s.getInputStream())); out = new PrintWriter(s.getOutputStream(), true); for (int i = 0; i < 3; i++) { System.out.println(in.readLine() + "\n"); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void send() { out.println(message.getText()); String response; try { response = in.readLine(); if (response == null || response.equals("")) { System.exit(0); } } catch (IOException ex) { response = "Error: " + ex; } history.setText(response); message.selectAll(); } public int getPort() { String p=server.getText(); int port=Integer.parseInt(p.substring(p.indexOf("/")+1, p.length())); return port; } public String getHost() { String p=server.getText(); return p.substring(0,p.indexOf("/")); }
}
|
|