Socket 网络编程
//Message
package com.common;import java.io.Serializable;public class Message  implements Serializable{
  private static final long serialVersionUID = 1L;
 
public String type="";
public String message="";
public Message(){
type="1";
message="ok";
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;

}

}
//Client
package com.client;import java.net.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.*;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;import com.common.Message;public class Client extends JFrame implements ActionListener,KeyListener{
/**
 * 
 */
private static final long serialVersionUID = 1L;
JTextArea jta=null;
JTextField jtf=null;
JButton jb=null;
JPanel jp=null;
JScrollPane jsp=null;
Socket s=null;

ObjectInputStream ois=null;
ObjectOutputStream oos=null;


//receiveMessage rm;
public Client(/*Socket s*/){
//this.s=s;
jta=new JTextArea();
jta.setEditable(false);
jtf=new JTextField(35);
jtf.addKeyListener(this);
jb=new JButton("send");
jb.addActionListener(this);
jp=new JPanel();
jsp=new JScrollPane(jta);
jp.add(jtf);
jp.add(jb);
this.add(jsp,"Center");
this.add(jp,"South");
this.setSize(500, 400);
this.setTitle("client");
this.setVisible(true);

this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { //System.out.print("Closing");
System.exit(0);
}
});
try{
s=new Socket("127.0.0.1",9999);
ois=new ObjectInputStream(s.getInputStream());
oos=new ObjectOutputStream(s.getOutputStream());

// while(true){
// String info=br.readLine();
// jta.append("server said:"+info+"\n");
// }
new ReceiveMessage().run();
}catch(Exception e){
e.printStackTrace();
}
} @Override
public void actionPerformed(ActionEvent e) {
Message m=new Message();
if(e.getSource()==jb){
String info=jtf.getText();
System.out.println(info);

m.setMessage(info);
try {
oos.writeObject(m);
} catch (IOException e1) {

e1.printStackTrace();
}
jta.append("you said:"+info+"\n");
jtf.setText("");
}
}
public class ReceiveMessage extends Thread{
public void run(){
try{
while(true){
Message m=(Message)ois.readObject();
String info=m.getMessage();
jta.append("client said:"+info+"\n");
}

}catch(Exception e){
e.printStackTrace();
}

}
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub

} @Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
if(e.getKeyCode()==KeyEvent.VK_ENTER){
String info=jtf.getText();
Message m=new Message();
m.setMessage(info);
try {
oos.writeObject(m);
} catch (IOException e1) {

e1.printStackTrace();
}
jta.append("you siad:"+info+"\n");

jtf.setText("");
}
} @Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub

}
}
//Server
package com.server;import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;import com.common.Message;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.*;public class Server extends JFrame implements ActionListener,KeyListener{
/**
 * 
 */
private static final long serialVersionUID = 1L;
JTextArea jta=null;
JTextField jtf=null;
JButton jb=null;
JPanel jp=null;
JScrollPane jsp=null;

ServerSocket ss=null;
Socket s=null;
ObjectInputStream ois=null;
ObjectOutputStream oos=null;

public Server(/*Socket s*/){
//this.s=s;
jta=new JTextArea();
jta.setEditable(false);
jtf=new JTextField(35);
jtf.addKeyListener((KeyListener) this);
   
jb=new JButton("send");
jb.addActionListener(this);
jp=new JPanel();
jsp=new JScrollPane(jta);
jp.add(jtf);
jp.add(jb);
this.add(jsp,"Center");
this.add(jp,"South");
ImageIcon test = new ImageIcon("\\image\\QQLogin.png"); 
setIconImage(test.getImage());
this.setSize(500, 400);
this.setTitle("Server");
this.setVisible(true);
this.addWindowListener(new WindowAdapter() {              public void windowClosing(WindowEvent e) { 
                  
                 System.exit(0); 
             } 
         }); 

try{
ss=new ServerSocket(9999);
s=ss.accept();
ois=new ObjectInputStream(s.getInputStream());
oos=new ObjectOutputStream(s.getOutputStream());

new ReceiveMessage().run();
}catch(Exception e){
e.printStackTrace();
}


}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource()==jb){
String info=jtf.getText();
Message m=new Message();
m.setMessage(info);
try {
oos.writeObject(m);
} catch (IOException e1) {

e1.printStackTrace();
}
jta.append("you siad:"+info+"\n");

jtf.setText("");
}
}
public class ReceiveMessage extends Thread{
public void run(){
try{
while(true){
Message m=(Message)ois.readObject();
String info=m.getMessage();
jta.append("client said:"+info+"\n");
}
}catch(Exception e){
e.printStackTrace();
}

}
}

public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub

}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
if(e.getKeyCode()==KeyEvent.VK_ENTER){
String info=jtf.getText();
Message m=new Message();
m.setMessage(info);
try {
oos.writeObject(m);
} catch (IOException e1) {

e1.printStackTrace();
}
jta.append("you siad:"+info+"\n");

jtf.setText("");
}
}

public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub

}

}
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at com.client.Client.actionPerformed(Client.java:89)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6437)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6202)
at java.awt.Container.processEvent(Container.java:2213)
at java.awt.Component.dispatchEventImpl(Component.java:4793)
at java.awt.Container.dispatchEventImpl(Container.java:2271)
at java.awt.Component.dispatchEvent(Component.java:4619)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4816)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4476)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4406)
at java.awt.Container.dispatchEventImpl(Container.java:2257)
at java.awt.Window.dispatchEventImpl(Window.java:2677)
at java.awt.Component.dispatchEvent(Component.java:4619)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:662)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

解决方案 »

  1.   

    Client类和Server的main方法都没有。
      

  2.   

    //Client
    public static void main(String[] args) {
    Client client=new Client();

    }
    //Server
    public static void main(String[] args) {
    Server server=new Server(); }
      

  3.   

    我调试一下。Client中的
    try {
    oos.writeObject(m);
    } catch (IOException e1) {
    一点击发送按钮,这里就出现了一个空指针异常。是oos为null。而oos是在Client的构造器中产生的,s=new Socket("127.0.0.1",9999);
    ois=new ObjectInputStream(s.getInputStream());
    oos=new ObjectOutputStream(s.getOutputStream());
    觉得问题在这里。但是怎么改,我现在还不太清楚。
    另外,启动一个新线程应该是new thread.start()吧,而你都是new thread.run()。
      

  4.   

    我刚做好了一个基于后台服务器转发的支持多人聊天的聊天工具,想看的话在CSDN里面给我留个言,写下你的邮箱我给你发一份。互相交流!