Java чат - упростить код
13.05.2012, 00:30. Показов 2734. Ответов 1
Может кто-нибудь будет так добр и поможет упростить код чата, а то уж больно много классов получилось. Ну или просто поделитесь мыслями как это дело упростить, что убрать и т.д.
Я прикрепил .zip файл, но если кому лень скачивать, то вот код всего, что есть (кода много, за что заренее извиняюсь):
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
| import java.net.Socket;
import java.io.BufferedInputStream;
import java.io.OutputStream;
import java.io.IOException;
public class UserConnection extends Thread {
private MessageListener listener;
private BufferedInputStream in;
private OutputStream out;
private String nick;
private boolean running;
private Socket socket;
public UserConnection(Socket s) {
socket=s;
try {
in=new BufferedInputStream(s.getInputStream());
out=s.getOutputStream();
} catch(IOException e) {
e.printStackTrace();
}
running=true;
start();
}
public void addMessageListener(MessageListener listener) {
this.listener=listener;
}
public void setNick(String nick) {
this.nick=nick;
}
public String getNick() {
return nick;
}
public void send(byte[] b) {
try {
out.write(b);
try {
Thread.sleep(100);
} catch(Exception e) {
e.printStackTrace();
}
out.flush();
} catch(IOException e) {
e.printStackTrace();
}
}
public void close() {
try {
running=false;
out.close();
in.close();
socket.close();
} catch(IOException e) {
e.printStackTrace();
}
}
public void run() {
while(running) {
try {
byte[] b=new byte[1024];
if(listener!=null && b.length!=0) {
int bytesRead=in.read(b);
if(bytesRead>0) {
byte[] c=new byte[bytesRead];
for(int i=0; i<c.length; i++) {
c[i]=b[i];
}
listener.receive(c, this);
}
}
} catch(IOException e) {
if(running)
listener.receive(new String(nick + ": Disconnected").getBytes(), this);
}
}
}
public boolean isRunning() {
return running;
}
public Socket getSocket() {
return socket;
}
} |
|
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
| import javax.swing.JPanel;
import javax.swing.JList;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import java.awt.BorderLayout;
import java.awt.Dimension;
public class UserDisplay extends JPanel {
private JList list;
private JPanel header;
public UserDisplay() {
setPreferredSize(new Dimension(180, 350));
setLayout(new BorderLayout());
list=new JList();
add(new JScrollPane(list));
header=new JPanel(new BorderLayout());
header.add(new JLabel("UserList: "), BorderLayout.WEST);
add(header, BorderLayout.NORTH);
}
public void setUserList(String userList) {
userList=userList.substring(userList.indexOf(": ")+2, userList.length());
String[] users;
if(userList.indexOf(",")!=-1) {
users=userList.split(",");
} else {
users=new String[0];
}
list.setListData(users);
}
public JPanel getHeader() {
return header;
}
public String getSelectedUser() {
return (String) list.getSelectedValue();
}
public void setSelectedIndex(int i) {
list.setSelectedIndex(i);
}
} |
|
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
| import java.awt.BorderLayout;
import javax.swing.*;
public class ChatRoom extends JFrame {
protected UserDisplay userDisplay;
private JTextArea chat;
private JList list;
private JPanel header;
public ChatRoom() {
//chat area
super("JChat by Clifford Burns");
setLayout(new BorderLayout());
chat=new JTextArea();
chat.setEditable(false);
chat.setLineWrap(true);
chat.setWrapStyleWord(true);
add(new JScrollPane(chat));
userDisplay=new UserDisplay();
JSplitPane splitPane=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true);
splitPane.setLeftComponent(userDisplay);
splitPane.setRightComponent(chat);
splitPane.setDividerSize(3);
add(splitPane);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void setUserList(String userlist) {
userDisplay.setUserList(userlist);
}
public synchronized void updateChat(String msg) {
chat.append("\n" + msg);
chat.setCaretPosition(chat.getText().length());
}
} |
|
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
| import java.net.Socket;
import java.io.IOException;
public class Client implements MessageListener {
private UserConnection uc;
private ClientChatRoom chat;
private boolean running;
public Client() {
chat=new ClientChatRoom();
chat.addMessageListener(this);
chat.addClientCommandListener(this);
chat.setSize(600, 350);
chat.setVisible(true);
}
public void connect(String nick) {
try {
uc=new UserConnection(new Socket("127.0.0.1", 5001));
uc.addMessageListener(this);
chat.setNick(nick);
send(new String(nick + ": Connected").getBytes());
} catch(IOException e) {
e.printStackTrace();
}
}
public void disconnect(String nick) {
send(new String(nick + ": Disconnected").getBytes());
uc.close();
running=false;
}
public boolean isConnected() {
if(uc!=null)
return uc.isRunning();
return false;
}
public void receive(byte[] b, UserConnection uc) {
String input=new String(b);
String name=input.substring(0, input.indexOf(": "));
if(name.equals("Userlist"))
chat.setUserList(input);
else
chat.updateChat(input);
}
public void send(byte[] b) {
uc.send(b);
}
public static void main(String[] args) {
Client c=new Client();
}
} |
|
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| import java.awt.BorderLayout;
public class ClientChatRoom extends ChatRoom {
private ClientCommandDisplay ccd;
private ClientMessageDisplay cmd;
public ClientChatRoom() {
super();
ccd=new ClientCommandDisplay();
cmd=new ClientMessageDisplay();
add(ccd, BorderLayout.NORTH);
add(cmd, BorderLayout.SOUTH);
}
public void addClientCommandListener(Client listener) {
ccd.addClientCommandListener(listener);
}
public void addMessageListener(MessageListener listener) {
cmd.addMessageListener(listener);
}
public void setNick(String nick) {
cmd.setNick(nick);
}
} |
|
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JPanel;
public class ClientCommandDisplay extends JPanel {
private JButton connect;
private JTextField nick;
private Client listener;
public ClientCommandDisplay() {
connect=new JButton("Connect");
connect.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String nickName=nick.getText();
if(!listener.isConnected() && !nickName.equals("") && !nickName.equals("Server")) {
listener.connect(nickName);
connect.setText("Disconnect");
nick.setEnabled(false);
} else {
listener.disconnect(nick.getText());
connect.setText("Connect");
nick.setEnabled(true);
}
}
});
nick=new JTextField(15);
add(new JLabel("Nick"));
add(nick);
add(connect);
}
public void addClientCommandListener(Client listener) {
this.listener=listener;
}
} |
|
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| import java.awt.event.ActionEvent;
public class ClientMessageDisplay extends MessageDisplay {
public ClientMessageDisplay() {
super();
}
public void actionPerformed(ActionEvent e) {
String message=msg.getText();
if(!message.equals("") && !message.equals("Connected") && !message.equals("Disconnected") && listener!=null) {
listener.send(new String(nick + ": " + message).getBytes());
msg.setText("");
msg.requestFocus(true);
}
}
} |
|
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
| import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public abstract class MessageDisplay extends JPanel implements ActionListener {
protected JTextField msg;
private JButton send;
protected MessageListener listener;
protected String nick;
private JLabel label;
public MessageDisplay() {
msg=new JTextField(25);
msg.addActionListener(this);
send=new JButton("Send");
send.addActionListener(this);
label=new JLabel();
add(label);
add(msg);
add(send);
}
public void setNick(String nick) {
this.nick=nick;
label.setText(nick + ":");
}
public void addMessageListener(MessageListener listener) {
this.listener=listener;
}
public abstract void actionPerformed(ActionEvent e);
} |
|
| Java | 1
2
3
4
| public interface MessageListener {
public void receive(byte[] b, UserConnection uc);
public void send(byte[] b);
} |
|
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
| import java.net.ServerSocket;
import java.net.Socket;
import java.net.InetSocketAddress;
import java.net.InetAddress;
import java.io.IOException;
import java.util.Vector;
public class Server implements Runnable, MessageListener /*, ServerCommandListener*/ {
private Vector<UserConnection> connections;
private Vector<String> bannedIP;
private ServerSocket serverSocket;
private ServerChatRoom chat;
public Server() {
connections=new Vector<UserConnection>();
bannedIP=new Vector<String>();
chat=new ServerChatRoom();
chat.addMessageListener(this);
chat.addServerCommandListener(this);
chat.setSize(800, 550);
chat.setVisible(true);
}
public void listen(int port) {
if(port!=-1) {
try {
serverSocket=new ServerSocket(port);
} catch(IOException e) {
e.printStackTrace();
}
Thread t=new Thread(this);
t.start();
chat.updateChat("Server listening on port " + serverSocket.getLocalPort() + "...");
}
}
public boolean isListening() {
if(serverSocket!=null) {
if(serverSocket.isClosed())
return false;
else
return true;
}
return false;
}
public void run() {
while(isListening()) {
try {
Socket socket=serverSocket.accept();
InetSocketAddress isa=(InetSocketAddress) socket.getRemoteSocketAddress();
InetAddress ia=isa.getAddress();
boolean banned=false;
for(String ban : bannedIP) {
if(ban.equals(ia.toString()))
banned=true;
}
if(!banned) {
UserConnection uc=new UserConnection(socket);
uc.addMessageListener(this);
connections.add(uc);
}
banned=false;
} catch(IOException e) {
//Do Nothing
//IOException will get thrown only when the ServerSocket is closed
}
}
}
public void receive(byte[] b, UserConnection uc) {
String input=new String(b);
String nick=input.substring(0, input.indexOf(": "));
String msg=input.substring(input.indexOf(": ")+2, input.length());
if(uc==null) //Input that comes from other places other than the UserConnection will have a null uc reference
uc=getUserConnectionFromNick(nick);
if(msg.equals("Connected")) { //Nick: Connected
uc.setNick(nick);
send(updateUserList().getBytes());
} else if(msg.equals("Disconnected")) { //Nick: Disconnected;
uc.close();
connections.remove(uc);
send(updateUserList().getBytes());
} else if(msg.equals("Kicked by Server")) { //Nick: Kicked by Server
uc.send(new String("Server: You have been kicked").getBytes()); //Do not need to use individualSend(byte[] b, String nick) because we are sending to current
//individualSend(new String("Server: You have been kicked"), nick);
Socket socket=uc.getSocket();
InetSocketAddress isa=(InetSocketAddress) socket.getRemoteSocketAddress();
InetAddress ia=isa.getAddress();
bannedIP.add(ia.toString());
uc.close();
connections.remove(uc);
send(updateUserList().getBytes());
} else if(msg.indexOf("PM>")!=-1) { //Nick: PM>To>personalMessage
int x=msg.indexOf("PM>")+3;
int y=msg.indexOf(">", x);
int z=msg.length();
String to=msg.substring(x, y);
String personalMessage=msg.substring(y+1, z);
String output=nick + ": <PM> " + personalMessage;
individualSend(output.getBytes(), to);
return; //Return so the server doesn't broadcast the PM
}
chat.updateChat(new String(b));
send(b);
}
public void send(byte[] b) {
for(UserConnection uc : connections) {
uc.send(b);
}
}
public void individualSend(byte[] b, String to) {
UserConnection uc=getUserConnectionFromNick(to);
if(uc!=null)
uc.send(b);
}
public UserConnection getUserConnectionFromNick(String nick) {
for(UserConnection temp : connections) {
if(temp.getNick().equals(nick))
return temp; //Find a real uc reference
}
return null;
}
public String updateUserList() {
String output="Userlist: ";
for(UserConnection uc: connections) {
output+= uc.getNick() + ",";
}
chat.setUserList(output);
return output;
}
public void close() {
try {
serverSocket.close();
for(UserConnection uc : connections) {
uc.close();
}
chat.updateChat("Server is closed...");
connections.removeAllElements();
bannedIP.removeAllElements();
updateUserList();
} catch(IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Server s = new Server();
}
} |
|
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
| import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ServerChatRoom extends ChatRoom {
private ServerCommandDisplay scd;
private ServerMessageDisplay smd;
private MessageListener messageListener;
public ServerChatRoom() {
super();
scd=new ServerCommandDisplay();
add(scd, BorderLayout.NORTH);
smd=new ServerMessageDisplay();
smd.setNick("Server");
add(smd, BorderLayout.SOUTH);
JPanel userListHeader = userDisplay.getHeader();
JButton kick=new JButton("Kick");
kick.setPreferredSize(new Dimension(55, 30));
kick.setFont(new Font(null, Font.PLAIN, 10));
kick.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String user=(String) userDisplay.getSelectedUser();
userDisplay.setSelectedIndex(-1);
if(user!=null)
messageListener.receive(new String(user + ": Kicked by Server").getBytes(), null);
}
});
userListHeader.add(kick, BorderLayout.EAST);
}
public void addServerCommandListener(Server listener) {
scd.addServerCommandListener(listener);
}
public void addMessageListener(MessageListener listener) {
smd.addMessageListener(listener);
messageListener=listener;
}
} |
|
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
| import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JPanel;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class ServerCommandDisplay extends JPanel {
private JTextField port;
private JButton listen;
private Server listener;
public ServerCommandDisplay() {
listen=new JButton("Listen");
listen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
boolean listening=listener.isListening();
if(!listening) {
if(!port.getText().equals("")) {
int x=Integer.parseInt(port.getText());
listener.listen(x);
listen.setText("Close");
}
} else {
listener.close();
listen.setText("Listen");
}
}
});
port=new JTextField(6);
port.setText("5001");
add(listen);
add(new JLabel(" on port "));
add(port);
}
public void addServerCommandListener(Server listener) {
this.listener=listener;
}
} |
|
| Java | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| import java.awt.event.ActionEvent;
public class ServerMessageDisplay extends MessageDisplay {
public ServerMessageDisplay() {
super();
}
public void actionPerformed(ActionEvent e) {
String message=msg.getText();
if(!msg.getText().equals("") && listener!=null) {
listener.receive(new String(nick + ": " + message).getBytes(), null);
msg.setText("");
msg.requestFocus(true);
}
}
} |
|
|