chris66001
شنبه 05 اسفند 1391, 16:27 عصر
سلام دوستان من یک سیستم چت داخلی نوشتم (Client/Server) کلا همه چیش درسته ولی الان میخوام یوزرنیم کسانی که آنلاین میشن رو به صورت یک آرایه در بیارم و تو یک JList نمایش بدم .
package Messenger2_3;
import java.io.*;
import java.net.*;
import java.text.SimpleDateFormat;
import java.util.*;
public class Server {
private static int uniqueId;
private ArrayList<ClientThread> al;
private ServerGUI sg;
private SimpleDateFormat sdf;
private int port;
private boolean keepGoing;
public static String[] array = null;
public Server(int port) {
this(port, null);
}
public Server(int port, ServerGUI sg) {
this.sg = sg;
this.port = port;
sdf = new SimpleDateFormat("HH:mm:ss");
al = new ArrayList<ClientThread>();
}
public void start() {
keepGoing = true;
try {
ServerSocket serverSocket = new ServerSocket(port);
while(keepGoing) {
display("Server waiting for Clients on port " + port + ".");
Socket socket = serverSocket.accept();
if(!keepGoing)
break;
ClientThread t = new ClientThread(socket);
al.add(t);
t.start();
}
try {
serverSocket.close();
for(int i = 0; i < al.size(); ++i) {
ClientThread tc = al.get(i);
try {
tc.sInput.close();
tc.sOutput.close();
tc.socket.close();
}catch(IOException ioE) {}
}
}catch(Exception e) {
display("Exception closing the server and clients: " + e);
}
}catch (IOException e) {
String msg = sdf.format(new Date()) + " Exception on new ServerSocket: " + e + "\n";
display(msg);
}
}
protected void stop() {
keepGoing = false;
try {
new Socket("Shahabi-PC", port);
}catch(Exception e) {}
}
private void display(String msg) {
String time = sdf.format(new Date()) + " " + msg;
if(sg == null)
System.out.println(time);
else
sg.appendEvent(time + "\n");
}
private synchronized void broadcast(String message) {
String time = sdf.format(new Date());
String messageLf = time + " " + message + "\n";
if(sg == null)
System.out.print(messageLf);
else
sg.appendRoom(messageLf);
for(int i = al.size(); --i >= 0;) {
ClientThread ct = al.get(i);
if(!ct.writeMsg(messageLf)) {
al.remove(i);
display("Disconnected Client " + ct.username + " removed from list.");
}
}
}
synchronized void remove(int id) {
for(int i = 0; i < al.size(); ++i) {
ClientThread ct = al.get(i);
if(ct.id == id) {
al.remove(i);
return;
}
}
}
public static void main(String[] args) {
int portNumber = 10000;
switch(args.length) {
case 1:
try {
portNumber = Integer.parseInt(args[0]);
}
catch(Exception e) {
System.out.println("Invalid port number.");
System.out.println("Usage is: > java Server [portNumber]");
return;
}
case 0:
break;
default:
System.out.println("Usage is: > java Server [portNumber]");
return;
}
Server server = new Server(portNumber);
server.start();
}
class ClientThread extends Thread {
Socket socket;
ObjectInputStream sInput;
ObjectOutputStream sOutput;
int id;
String username;
ChatMessage cm;
String date;
ClientThread(Socket socket) {
id = ++uniqueId;
this.socket = socket;
System.out.println("Thread trying to create Object Input/Output Streams");
try{
sOutput = new ObjectOutputStream(socket.getOutputStream());
sInput = new ObjectInputStream(socket.getInputStream());
username = (String) sInput.readObject();
display(username + " just connected.");
}catch (IOException e) {
display("Exception creating new Input/output Streams: " + e);
return;
}catch (ClassNotFoundException e) {}
date = new Date().toString() + "\n";
}
public void run() {
boolean keepGoing = true;
while(keepGoing) {
try {
cm = (ChatMessage) sInput.readObject();
}
catch (IOException e) {
display(username + " Exception reading Streams: " + e);
break;
}
catch(ClassNotFoundException e2) {
break;
}
String message = cm.getMessage();
switch(cm.getType()) {
case ChatMessage.MESSAGE:
broadcast(username + ": " + message);
break;
case ChatMessage.LOGOUT:
display(username + " disconnected with a LOGOUT message.");
keepGoing = false;
break;
case ChatMessage.WHOISIN:
writeMsg("List of the users connected at " + sdf.format(new Date()) + "\n");
array = new String[al.size()];
for(int i = 0; i < al.size(); ++i) {
ClientThread ct = al.get(i);
writeMsg((i+1) + ") " + ct.username + " since " + ct.date);
array[i] = ct.username+"\t";
}
break;
}
}
remove(id);
close();
}
private void close() {
try {
if(sOutput != null) sOutput.close();
}catch(Exception e) {}
try {
if(sInput != null) sInput.close();
}catch(Exception e) {};
try {
if(socket != null) socket.close();
}catch (Exception e) {}
}
private boolean writeMsg(String msg) {
if(!socket.isConnected()) {
close();
return false;
}
try {
sOutput.writeObject(msg);
}
catch(IOException e) {
display("Error sending message to " + username);
display(e.toString());
}
return true;
}
}
}
package Messenger2_3;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ClientGUI extends JFrame implements ActionListener {
private JLabel label;
private JTextField tf;
private JTextField tfServer, tfPort;
private JButton login, logout, whoIsIn, send;
private JTextArea ta;
private boolean connected;
private Client client;
private int defaultPort;
private String defaultHost;
private JList online;
private DefaultListModel model;
ClientGUI(String host, int port) {
super("Chat Client");
defaultPort = port;
defaultHost = host;
JPanel northPanel = new JPanel(new GridLayout(3,1));
JPanel serverAndPort = new JPanel(new GridLayout(1,5));
JPanel northPanel_1 = new JPanel(new GridLayout(1,2));
JPanel northPanel_2 = new JPanel(new GridLayout(1,1));
tfServer = new JTextField(host);
tfPort = new JTextField("" + port);
tfPort.setHorizontalAlignment(SwingConstants.RIGHT );
serverAndPort.add(new JLabel("Server Address: "));
serverAndPort.add(tfServer);
serverAndPort.add(new JLabel("Port Number: "));
serverAndPort.add(tfPort);
serverAndPort.add(new JLabel(""));
label = new JLabel("Enter your username below", SwingConstants.LEFT);
northPanel_2.add(label,BorderLayout.WEST);
tf = new JTextField();
tf.setBackground(Color.WHITE);
send = new JButton("send");
northPanel_1.add(tf,BorderLayout.WEST);
northPanel_1.add(send,BorderLayout.EAST);
northPanel.add(serverAndPort);
northPanel.add(northPanel_2);
northPanel.add(northPanel_1);
add(northPanel,BorderLayout.NORTH);
ta = new JTextArea("Welcome to the Chat room\n", 9, 20);
model = new DefaultListModel();
online = new JList(model);
JPanel centerPanel = new JPanel(new GridLayout(1,2));
centerPanel.add(new JScrollPane(ta));
centerPanel.add(new JScrollPane(online));
ta.setEditable(false);
add(centerPanel, BorderLayout.CENTER);
login = new JButton("Login");
login.addActionListener(this);
logout = new JButton("Logout");
logout.addActionListener(this);
logout.setEnabled(false);
whoIsIn = new JButton("Who is in");
whoIsIn.addActionListener(this);
whoIsIn.setEnabled(false);
send.addActionListener(this);
send.setEnabled(false);
JPanel southPanel = new JPanel();
southPanel.add(login);
southPanel.add(logout);
southPanel.add(whoIsIn);
add(southPanel, BorderLayout.SOUTH);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(700, 350);
setVisible(true);
tf.requestFocus();
}
void append(String str) {
ta.append(str);
ta.setCaretPosition(ta.getText().length() - 1);
}
void connectionFailed() {
login.setEnabled(true);
logout.setEnabled(false);
whoIsIn.setEnabled(false);
send.setEnabled(false);
label.setText("Enter your username below");
tf.setText("Anonymous");
tfPort.setText("" + defaultPort);
tfServer.setText(defaultHost);
tfServer.setEditable(false);
tfPort.setEditable(false);
tf.removeActionListener(this);
connected = false;
}
public void actionPerformed(ActionEvent e) {
Object o = e.getSource();
if(o == logout) {
client.sendMessage(new ChatMessage(ChatMessage.LOGOUT, ""));
return;
}
if(o == whoIsIn) {
client.sendMessage(new ChatMessage(ChatMessage.WHOISIN, ""));
model.addElement(Server.array);
model.addElement("test");
online.setModel(model);
return;
}
if(connected || o==send) {
client.sendMessage(new ChatMessage(ChatMessage.MESSAGE, tf.getText()));
tf.setText("");
return;
}
if(o == login) {
String username = tf.getText().trim();
if(username.length() == 0)
return;
String server = tfServer.getText().trim();
if(server.length() == 0)
return;
String portNumber = tfPort.getText().trim();
if(portNumber.length() == 0)
return;
int port = 0;
try {
port = Integer.parseInt(portNumber);
}
catch(Exception en) {
return;
}
client = new Client(server, port, username, this);
if(!client.start())
return;
tf.setText("");
label.setText("Enter your message below");
connected = true;
login.setEnabled(false);
logout.setEnabled(true);
whoIsIn.setEnabled(true);
send.setEnabled(true);
tfServer.setEditable(false);
tfPort.setEditable(false);
tf.addActionListener(this);
}
}
public static void main(String[] args) {
new ClientGUI("Shahabi-PC", 10000);
}
}
مشکل من این خط در کلاس Server است (خط 184)
array[i] = ct.username+"\t";
که وقتی اون رو در کلاس ClientGUI فراخوانی میکنیم و دیباگ میکنم میگه این مقدار را نمیشناسه و حتی اکسپشن هم نمیگیره و هیچ چیزی هم در JList نمایش نمیده (خط 123)
model.addElement(Server.array);
لطفا اگه میتونید کمک کنید.
package Messenger2_3;
import java.io.*;
import java.net.*;
import java.text.SimpleDateFormat;
import java.util.*;
public class Server {
private static int uniqueId;
private ArrayList<ClientThread> al;
private ServerGUI sg;
private SimpleDateFormat sdf;
private int port;
private boolean keepGoing;
public static String[] array = null;
public Server(int port) {
this(port, null);
}
public Server(int port, ServerGUI sg) {
this.sg = sg;
this.port = port;
sdf = new SimpleDateFormat("HH:mm:ss");
al = new ArrayList<ClientThread>();
}
public void start() {
keepGoing = true;
try {
ServerSocket serverSocket = new ServerSocket(port);
while(keepGoing) {
display("Server waiting for Clients on port " + port + ".");
Socket socket = serverSocket.accept();
if(!keepGoing)
break;
ClientThread t = new ClientThread(socket);
al.add(t);
t.start();
}
try {
serverSocket.close();
for(int i = 0; i < al.size(); ++i) {
ClientThread tc = al.get(i);
try {
tc.sInput.close();
tc.sOutput.close();
tc.socket.close();
}catch(IOException ioE) {}
}
}catch(Exception e) {
display("Exception closing the server and clients: " + e);
}
}catch (IOException e) {
String msg = sdf.format(new Date()) + " Exception on new ServerSocket: " + e + "\n";
display(msg);
}
}
protected void stop() {
keepGoing = false;
try {
new Socket("Shahabi-PC", port);
}catch(Exception e) {}
}
private void display(String msg) {
String time = sdf.format(new Date()) + " " + msg;
if(sg == null)
System.out.println(time);
else
sg.appendEvent(time + "\n");
}
private synchronized void broadcast(String message) {
String time = sdf.format(new Date());
String messageLf = time + " " + message + "\n";
if(sg == null)
System.out.print(messageLf);
else
sg.appendRoom(messageLf);
for(int i = al.size(); --i >= 0;) {
ClientThread ct = al.get(i);
if(!ct.writeMsg(messageLf)) {
al.remove(i);
display("Disconnected Client " + ct.username + " removed from list.");
}
}
}
synchronized void remove(int id) {
for(int i = 0; i < al.size(); ++i) {
ClientThread ct = al.get(i);
if(ct.id == id) {
al.remove(i);
return;
}
}
}
public static void main(String[] args) {
int portNumber = 10000;
switch(args.length) {
case 1:
try {
portNumber = Integer.parseInt(args[0]);
}
catch(Exception e) {
System.out.println("Invalid port number.");
System.out.println("Usage is: > java Server [portNumber]");
return;
}
case 0:
break;
default:
System.out.println("Usage is: > java Server [portNumber]");
return;
}
Server server = new Server(portNumber);
server.start();
}
class ClientThread extends Thread {
Socket socket;
ObjectInputStream sInput;
ObjectOutputStream sOutput;
int id;
String username;
ChatMessage cm;
String date;
ClientThread(Socket socket) {
id = ++uniqueId;
this.socket = socket;
System.out.println("Thread trying to create Object Input/Output Streams");
try{
sOutput = new ObjectOutputStream(socket.getOutputStream());
sInput = new ObjectInputStream(socket.getInputStream());
username = (String) sInput.readObject();
display(username + " just connected.");
}catch (IOException e) {
display("Exception creating new Input/output Streams: " + e);
return;
}catch (ClassNotFoundException e) {}
date = new Date().toString() + "\n";
}
public void run() {
boolean keepGoing = true;
while(keepGoing) {
try {
cm = (ChatMessage) sInput.readObject();
}
catch (IOException e) {
display(username + " Exception reading Streams: " + e);
break;
}
catch(ClassNotFoundException e2) {
break;
}
String message = cm.getMessage();
switch(cm.getType()) {
case ChatMessage.MESSAGE:
broadcast(username + ": " + message);
break;
case ChatMessage.LOGOUT:
display(username + " disconnected with a LOGOUT message.");
keepGoing = false;
break;
case ChatMessage.WHOISIN:
writeMsg("List of the users connected at " + sdf.format(new Date()) + "\n");
array = new String[al.size()];
for(int i = 0; i < al.size(); ++i) {
ClientThread ct = al.get(i);
writeMsg((i+1) + ") " + ct.username + " since " + ct.date);
array[i] = ct.username+"\t";
}
break;
}
}
remove(id);
close();
}
private void close() {
try {
if(sOutput != null) sOutput.close();
}catch(Exception e) {}
try {
if(sInput != null) sInput.close();
}catch(Exception e) {};
try {
if(socket != null) socket.close();
}catch (Exception e) {}
}
private boolean writeMsg(String msg) {
if(!socket.isConnected()) {
close();
return false;
}
try {
sOutput.writeObject(msg);
}
catch(IOException e) {
display("Error sending message to " + username);
display(e.toString());
}
return true;
}
}
}
package Messenger2_3;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ClientGUI extends JFrame implements ActionListener {
private JLabel label;
private JTextField tf;
private JTextField tfServer, tfPort;
private JButton login, logout, whoIsIn, send;
private JTextArea ta;
private boolean connected;
private Client client;
private int defaultPort;
private String defaultHost;
private JList online;
private DefaultListModel model;
ClientGUI(String host, int port) {
super("Chat Client");
defaultPort = port;
defaultHost = host;
JPanel northPanel = new JPanel(new GridLayout(3,1));
JPanel serverAndPort = new JPanel(new GridLayout(1,5));
JPanel northPanel_1 = new JPanel(new GridLayout(1,2));
JPanel northPanel_2 = new JPanel(new GridLayout(1,1));
tfServer = new JTextField(host);
tfPort = new JTextField("" + port);
tfPort.setHorizontalAlignment(SwingConstants.RIGHT );
serverAndPort.add(new JLabel("Server Address: "));
serverAndPort.add(tfServer);
serverAndPort.add(new JLabel("Port Number: "));
serverAndPort.add(tfPort);
serverAndPort.add(new JLabel(""));
label = new JLabel("Enter your username below", SwingConstants.LEFT);
northPanel_2.add(label,BorderLayout.WEST);
tf = new JTextField();
tf.setBackground(Color.WHITE);
send = new JButton("send");
northPanel_1.add(tf,BorderLayout.WEST);
northPanel_1.add(send,BorderLayout.EAST);
northPanel.add(serverAndPort);
northPanel.add(northPanel_2);
northPanel.add(northPanel_1);
add(northPanel,BorderLayout.NORTH);
ta = new JTextArea("Welcome to the Chat room\n", 9, 20);
model = new DefaultListModel();
online = new JList(model);
JPanel centerPanel = new JPanel(new GridLayout(1,2));
centerPanel.add(new JScrollPane(ta));
centerPanel.add(new JScrollPane(online));
ta.setEditable(false);
add(centerPanel, BorderLayout.CENTER);
login = new JButton("Login");
login.addActionListener(this);
logout = new JButton("Logout");
logout.addActionListener(this);
logout.setEnabled(false);
whoIsIn = new JButton("Who is in");
whoIsIn.addActionListener(this);
whoIsIn.setEnabled(false);
send.addActionListener(this);
send.setEnabled(false);
JPanel southPanel = new JPanel();
southPanel.add(login);
southPanel.add(logout);
southPanel.add(whoIsIn);
add(southPanel, BorderLayout.SOUTH);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(700, 350);
setVisible(true);
tf.requestFocus();
}
void append(String str) {
ta.append(str);
ta.setCaretPosition(ta.getText().length() - 1);
}
void connectionFailed() {
login.setEnabled(true);
logout.setEnabled(false);
whoIsIn.setEnabled(false);
send.setEnabled(false);
label.setText("Enter your username below");
tf.setText("Anonymous");
tfPort.setText("" + defaultPort);
tfServer.setText(defaultHost);
tfServer.setEditable(false);
tfPort.setEditable(false);
tf.removeActionListener(this);
connected = false;
}
public void actionPerformed(ActionEvent e) {
Object o = e.getSource();
if(o == logout) {
client.sendMessage(new ChatMessage(ChatMessage.LOGOUT, ""));
return;
}
if(o == whoIsIn) {
client.sendMessage(new ChatMessage(ChatMessage.WHOISIN, ""));
model.addElement(Server.array);
model.addElement("test");
online.setModel(model);
return;
}
if(connected || o==send) {
client.sendMessage(new ChatMessage(ChatMessage.MESSAGE, tf.getText()));
tf.setText("");
return;
}
if(o == login) {
String username = tf.getText().trim();
if(username.length() == 0)
return;
String server = tfServer.getText().trim();
if(server.length() == 0)
return;
String portNumber = tfPort.getText().trim();
if(portNumber.length() == 0)
return;
int port = 0;
try {
port = Integer.parseInt(portNumber);
}
catch(Exception en) {
return;
}
client = new Client(server, port, username, this);
if(!client.start())
return;
tf.setText("");
label.setText("Enter your message below");
connected = true;
login.setEnabled(false);
logout.setEnabled(true);
whoIsIn.setEnabled(true);
send.setEnabled(true);
tfServer.setEditable(false);
tfPort.setEditable(false);
tf.addActionListener(this);
}
}
public static void main(String[] args) {
new ClientGUI("Shahabi-PC", 10000);
}
}
مشکل من این خط در کلاس Server است (خط 184)
array[i] = ct.username+"\t";
که وقتی اون رو در کلاس ClientGUI فراخوانی میکنیم و دیباگ میکنم میگه این مقدار را نمیشناسه و حتی اکسپشن هم نمیگیره و هیچ چیزی هم در JList نمایش نمیده (خط 123)
model.addElement(Server.array);
لطفا اگه میتونید کمک کنید.