Olá, pessoal do GUJ!
A partir de um código que foi postado aqui no GUJ, comecei o desenvolvimento do meu chat. O servidor tem um erro quando um client se conect. O client ele inicia, o servidor reconhece que ele se conectou, mas o GUI não é criado e a janela fica preta/branca (a do client), como se estivesse travada! Segue o erro do servidor, o que me parece um problema com os threads:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Server.talk(Server.java:66)
at Server.chat(Server.java:57)
at Server.startServer(Server.java:41)
at Server.onButtonClicked(Server.java:160)
at Server.access$000(Server.java:26)
at Server$2.actionPerformed(Server.java:131)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6267)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6032)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Código da thread do servidor:
[code]private void listen(final InputStream inputStream)
{
new Thread(new Runnable() {
DataInputStream ds = new DataInputStream(inputStream);
public void run()
{
try
{
while(true) {
int size = ds.readInt();
int cont = 0;
char[] chars = new char[size];
while (cont < size) {
chars[cont] = ds.readChar();
cont = cont + 1;
}
String str = new String(chars);
msgTextArea.append(": " + str);
line = str;
}
} catch (IOException e)
{
}
}
}).start();
}[/code]
Código do client:
[code]public class Client extends javax.swing.JFrame {
Socket socket;
String line;
/** Creates new form Client */
public Client() {
initComponents();
}
private void startClient(String host, int port)
{
try
{
socket = new Socket();
socket.connect(new InetSocketAddress(host, port));
chat(socket);
}
catch (UnknownHostException e)
{
JOptionPane.showMessageDialog(this,
"Erro na conexão - java.net.UnknownHostException",
"Erro",
JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
System.exit(2);
}
catch (IOException e)
{
JOptionPane.showMessageDialog(this,
"Erro na conexão - java.io.IOException",
"Erro",
JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
System.exit(1);
}
}
private void chat(Socket s) throws IOException
{
msgTextArea.append("Conectado com " + s.getRemoteSocketAddress() + "\n");
listen(s.getInputStream());
talk(s.getOutputStream());
}
/**
* @param outputStream
*/
private void talk(OutputStream outputStream) throws IOException
{
DataOutputStream output = new DataOutputStream(outputStream);
while(true)
{
if(!line.equals("")) {
output.writeInt(line.length());
for (char ch : line.toCharArray())
output.writeChar(ch);
output.flush();
line = "";
}
}
}
/**
* @param inputStream
*/
private void listen(final InputStream inputStream)
{
DataInputStream ds = new DataInputStream(inputStream);
try {
while(true) {
int size = ds.readInt();
int cont = 0;
char[] chars = new char[size];
while (cont < size) {
chars[cont] = ds.readChar();
cont = cont + 1;
}
String str = new String(chars);
msgTextArea.append(str);
msgTextField.setText("");
}
} catch (IOException e) {
}
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jSeparator1 = new javax.swing.JSeparator();
jScrollPane1 = new javax.swing.JScrollPane();
msgTextArea = new javax.swing.JTextArea();
msgTextField = new javax.swing.JTextField();
sendButton = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
msgTextArea.setColumns(20);
msgTextArea.setRows(5);
msgTextArea.setFocusable(false);
jScrollPane1.setViewportView(msgTextArea);
sendButton.setText("Enviar");
sendButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
sendButtonClicked(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
.addComponent(jSeparator1, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(msgTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 290, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 27, Short.MAX_VALUE)
.addComponent(sendButton)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 335, Short.MAX_VALUE)
.addGap(18, 18, 18)
.addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(3, 3, 3)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(msgTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(sendButton))
.addContainerGap())
);
pack();
}// </editor-fold>
private void sendButtonClicked(java.awt.event.ActionEvent evt) {
line = msgTextField.getText();
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
Client c = new Client();
c.setVisible(true);
c.startClient("127.0.0.1", 4360);
}
});
}
// Variables declaration - do not modify
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JSeparator jSeparator1;
public javax.swing.JTextArea msgTextArea;
public javax.swing.JTextField msgTextField;
public javax.swing.JButton sendButton;
// End of variables declaration
}[/code]
Eu sei que é um pouco de c´´odigo de mais, mas se vocês puderes me ajudar, ficarei grato.