关于网络编程中的NullPointer异常

glzlaohuai 2009-11-17 03:05:42
刚学java不久,最近看到了JAVA中的网络编程,试着自己写了下,但是每次但有客户端登录时候,服务器端都会报告异常,服务器端代码附下,希望哪位大虾指点一二啊。
import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.util.*;
public class Server extends JFrame
{
private int port; //端口号
private JTextField jtf1=new JTextField();
private JTextArea jta=new JTextArea();
private JButton b=new JButton("建立");
private LinkedList<ServerHander> clientList=new LinkedList<ServerHander>();
private int num=0;
public Server()
{
JPanel p1=new JPanel();
p1.setLayout(new BorderLayout());
p1.add(jtf1,BorderLayout.CENTER);
p1.setBorder(new TitledBorder("端口号(0~65535)"));


JPanel p2=new JPanel();
p2.setLayout(new BorderLayout());
p2.add(b,BorderLayout.CENTER);

JPanel p3=new JPanel();
p3.setLayout(new GridLayout(1,2));
p3.add(p1);
p3.add(p2);

this.setLayout(new BorderLayout());
this.add(p3,BorderLayout.NORTH);
this.add(jta,BorderLayout.CENTER);

//jta.setEditable(false);
jtf1.setToolTipText("服务器将监听试图连接到此端口上的客户端");
b.addActionListener(new ButtonAct());
}
public static void main(String args[])
{
Server frame=new Server();
frame.setBounds(100,150,400,100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
class ButtonAct implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
try
{
port=Integer.parseInt(jtf1.getText().trim());
if((port>65535)||(port<0))
{
jta.append("请在一个适当的端口上启动服务器!"+"\n");
}
ServerSocket ss=new ServerSocket(port);
jta.append("服务器成功启动于 :"+port);
System.out.println("服务器成功启动于 :"+port);
jta.append("\n"+new Date()+"\n");
System.out.println(new Date());
b.setEnabled(false);
Socket s;
String name;
while(true)
{
s=ss.accept();
num++;
DataInputStream fromClient=new DataInputStream(s.getInputStream());
name=fromClient.readUTF();
System.out.println("有新的成员加入,ip: "+s.getInetAddress()+"昵称 :"+name+" "+new Date());
System.out.println("现有成员数"+num);
jta.append("有新的成员加入,ip: "+s.getInetAddress()+" "+"昵称 :"+name+"\n");
jta.append("现在的成员数:"+num);
ServerHander sh=new ServerHander(name,s);
sh.start();
}
}
catch(IOException ex)
{
ex.printStackTrace();
}
}
}
class ServerHander extends Thread
{
String name;
Socket s;
DataInputStream fromClient;
DataOutputStream toClient;
String msg;
ServerHander(String name,Socket s)
{
this.name=name;
this.s=s;
}
ServerHander()
{
;
}
public void run()
{
clientList.add(this);
sendAllClient(new Date()+" Server:");
sendAllClient(name+" 进入********************");
try
{
fromClient=new DataInputStream(s.getInputStream());
toClient=new DataOutputStream(s.getOutputStream());
while(true)
{
msg=fromClient.readUTF();
sendAllClient(msg);
}
}
catch(Exception ex)
{
clientList.remove(this);
num--;
System.out.println(name+"离开 "+new Date());
sendAllClient(name+" 离开********************");
}
}
public void sendAllClient(String msg) //给所有的客户端传送信息
{
Iterator i=clientList.iterator();
ServerHander sh;
while(i.hasNext())
{
sh=(ServerHander)i.next();
try
{
sh.toClient.writeUTF(msg);
}
catch(IOException ex)
{
ex.printStackTrace();
}
}
}
}
}
...全文
134 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
glzlaohuai 2009-11-17
  • 打赏
  • 举报
回复
谢谢各位
smallbear923 2009-11-17
  • 打赏
  • 举报
回复
学习啦~
icekay Song 2009-11-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 healer_kx 的回复:]
哦,很简单的逻辑错误:看这几句~

clientList.add(this);
sendAllClient(new Date() + "  Server:");
sendAllClient(name + " 进入********************");
try {
fromClient = new DataInputStream(s.getInputStream());
toClient = new DataOutputStream(s.getOutputStream());

在当前的ServerHandler加入List之后,没有初始化toClient之前,你就sendAllClient了。
那么toClient当然没有了。

我觉得问题你自己也能搞定。

[/Quote]


恩.就是还没有初始化输入流管道呢,就向所有客户端发送数据了....
zl3450341 2009-11-17
  • 打赏
  • 举报
回复
java.lang.NullPointerException
空指针异常啊

先看看
healer_kx 2009-11-17
  • 打赏
  • 举报
回复
哦,很简单的逻辑错误:看这几句~

clientList.add(this);
sendAllClient(new Date() + " Server:");
sendAllClient(name + " 进入********************");
try {
fromClient = new DataInputStream(s.getInputStream());
toClient = new DataOutputStream(s.getOutputStream());

在当前的ServerHandler加入List之后,没有初始化toClient之前,你就sendAllClient了。
那么toClient当然没有了。

我觉得问题你自己也能搞定。
glzlaohuai 2009-11-17
  • 打赏
  • 举报
回复
今天下午弄一下午了,看得头都大了~,先出去转一圈透透气,谢谢同学帮忙了~。
healer_kx 2009-11-17
  • 打赏
  • 举报
回复
最直接的错误是toClient为null了。继续看深层次的原因。
glzlaohuai 2009-11-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 healer_kx 的回复:]
什么异常啊?把异常列出来,
还有,你的客户端要向server发送什么信息啊?
[/Quote]
异常信息:
Exception in thread "Thread-3" java.lang.NullPointerException
at Server$ServerHander.sendAllClient<Server.java:136>
at Server$ServerHander.run<Server.java:107>
谢谢同学帮忙了啊~~~
glzlaohuai 2009-11-17
  • 打赏
  • 举报
回复
好吧~客户端的代码附下:
import java.net.*;
import java.io.*;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class Client extends JFrame
{
private JTextField jtf1=new JTextField(); //端口号
private JTextField jtf2=new JTextField(); //ip地址
private JTextField jtf3=new JTextField(); //昵称
private JTextArea jta1=new JTextArea();
private JTextArea jta2=new JTextArea();
private JButton b=new JButton("登录");
public Client()
{
JPanel p1=new JPanel();
p1.setLayout(new BorderLayout());
p1.add(jtf1,BorderLayout.CENTER);
p1.setBorder(new TitledBorder("服务器的IP地址"));

JPanel p2=new JPanel();
p2.setLayout(new BorderLayout());
p2.add(jtf2,BorderLayout.CENTER);
p2.setBorder(new TitledBorder("服务器所监听的端口号"));


JPanel p3=new JPanel();
p3.setLayout(new BorderLayout());
p3.add(jtf3,BorderLayout.CENTER);
p3.setBorder(new TitledBorder("你的昵称"));


JPanel p4=new JPanel();
p4.setLayout(new GridLayout(1,3));
p4.add(p1);
p4.add(p2);
p4.add(p3);


JPanel p6=new JPanel();
p6.add(b);


jta1.setEditable(false);
//jta1.setBackground(Color.green);
//jta2.setBackground(Color.BLUE);
//jta2.setForeground(Color.MAGENTA);


JScrollPane jsp1=new JScrollPane(jta1);


JScrollPane jsp2=new JScrollPane(jta2);


JSplitPane jsp=new JSplitPane(JSplitPane.VERTICAL_SPLIT,jsp1,jsp2);
jsp.setDividerLocation(300);
jsp.setDividerSize(15);

b.addActionListener(new ButtonAct());

this.setLayout(new BorderLayout());
this.add(p4,BorderLayout.NORTH);
this.add(jsp,BorderLayout.CENTER);
this.add(p6,BorderLayout.SOUTH);
}
public static void main(String args[])
{
Client frame=new Client();
frame.setBounds(100,150,800,500);
frame.setTitle("客户端");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
class ButtonAct implements ActionListener
{
DataInputStream fromServer;
DataOutputStream toServer;
String msg;
public void actionPerformed(ActionEvent e)
{
int port;
String ip;
String name;
ip=jtf1.getText().trim();
port=Integer.parseInt(jtf2.getText().trim());
name=jtf3.getText().trim();
try
{
Socket s=new Socket(ip,port);
b.setEnabled(false);
fromServer=new DataInputStream(s.getInputStream());
toServer=new DataOutputStream(s.getOutputStream());
toServer.writeUTF(name);
jta2.addKeyListener(new TextAct());
while(true)
{
msg=fromServer.readUTF();
jta1.append(msg+"\n");
}
}
catch(Exception ex)
{
jta1.append("错误的ip地址或者端口号,或者服务器未启动"+"\n");
b.setEnabled(true);
}
}
class TextAct extends KeyAdapter
{
public void keyPressed(KeyEvent e)
{
if(e.getKeyCode()==10)
{
try
{
toServer.writeUTF(jta2.getText());
}
catch(IOException ex)
{
ex.printStackTrace();
}
jta2.setText("");
}
}
}
}
}
healer_kx 2009-11-17
  • 打赏
  • 举报
回复
你真的应该给我Client的代码,否则我还得写代码,其实我用Firefox也能发,但是发的东西不对了。。。
healer_kx 2009-11-17
  • 打赏
  • 举报
回复
什么异常啊?把异常列出来,
还有,你的客户端要向server发送什么信息啊?
glzlaohuai 2009-11-17
  • 打赏
  • 举报
回复
135和106行
healer_kx 2009-11-17
  • 打赏
  • 举报
回复
哪里有异常啊?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧