新手求教!使用序列化做的时候,我的服务器端抛出了空指针异常,该怎么修改呢?

来源:5-1 Socket 总结

陈婉

2016-07-30 21:51

服务器端

package com.imooc;


import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStream;

import java.io.ObjectInputStream;

import java.io.OutputStream;

import java.io.PrintWriter;

import java.io.Writer;

import java.net.ServerSocket;

import java.net.Socket;

import java.net.UnknownHostException;


public class ObjectServer {


/**

* @param args

* @throws IOException 

* @throws UnknownHostException 

*/

public static void main(String[] args) throws IOException  {

// Socket socket=new Socket("localhost", 8888);

// System.out.println("InetAddress:"+socket.getInetAddress());

ServerSocket serverSocket=new ServerSocket(8888);

Socket socket = null;

InputStream is=null;

OutputStream os = null;

ObjectInputStream ois=null;

BufferedReader br = null;

PrintWriter pw = null;

try {

is=socket.getInputStream();      //【】【】这里就是出错的地方,第34行

ois=new ObjectInputStream(is);

String info;

while((info=br.readLine())!=null){

System.out.println("我是服务器,客户端说:"+info);

}

socket.shutdownInput();

os=socket.getOutputStream();

pw=new PrintWriter(os);

pw.write("欢迎您!");

pw.flush();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

if(is!=null)

is.close();

if(os!=null)

os.close();

if(ois!=null)

ois.close();

if(br!=null)

br.close();

if(pw!=null)

pw.close();

if(socket!=null)

socket.close();

}


}


}


客户端

package com.imooc;


public class User {


private String userName;

private String userKey;

public User(String userName,String userKey){

this.userName=userName;

this.userKey=userKey;

}

}

package com.imooc;


import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.ObjectOutputStream;

import java.io.OutputStream;

import java.net.Socket;

import java.net.UnknownHostException;



public class ObjectClient {


/**

* @param args

*/


public static void main(String[] args) {

try {

Socket socket=new Socket("localhost", 8888);

System.out.println("InetAddress:"+socket.getInetAddress());

OutputStream os=socket.getOutputStream();

//使用ObjectOutputStream对象序列化流,传递对象

ObjectOutputStream oos=new ObjectOutputStream(os);

User user=new User("admin", "123");

oos.writeObject(user);//序列化

socket.shutdownOutput();

BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));

String info=br.readLine();

while(info!=null){

System.out.println("我是客户端,服务器说:"+info);

// info=br.readLine();

}

} catch (UnknownHostException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}


}


运行服务器端ObjectServer类是抛出的异常如图片所示http://img.mukewang.com/579cb08a00015d2507230544.jpg

写回答 关注

2回答

  • qq_海贼_0
    2016-08-01 16:12:56
    已采纳

    你的代码写错了,服务器端socket是由serverSocket.accept();来初始化,这样获取客户端传来的数据,除此之外你的User类还需要实现序列化接口,implements Serializable,最好把set/get方法补上,JavaBean的习惯养好,另外如果报端口号占用的异常,你就把端口号改一下,因为你按老师步骤实践可能8888端口之前已经用过了。

    //1、创建一个服务器端Socket,即serverSocket,指定绑定的端口
    		ServerSocket serverSocket=new ServerSocket(8801);
    		//2、调用accept方法开始监听,等待客户端的连接
    		System.out.println("***服务器即将启动,等待客户端的连接****");
    		Socket socket=serverSocket.accept();
    		//3、获取输入流,并读取客户端信息
    		InputStream is=socket.getInputStream();//字节输入流
    		//反序列化
    		ObjectInputStream ois=new ObjectInputStream(is);
    		User user=(User)ois.readObject();
    		System.out.println("我是服务器,客户端说:"+user.toString());


    陈婉

    非常感谢!

    2016-08-01 20:56:25

    共 1 条回复 >

  • 最终幻想ssd
    2016-08-01 14:41:09

    你可以在那行提示空指针的下面在写一个}catch(NullPointerException e ){这样就可以避免了,可以通过添加多个catch语句来规避遇到的多个异常。

Java Socket应用---通信是这样练成的

分享的是 Java 中的网络编程,使用Socket实现网络聊天通信

125006 学习 · 596 问题

查看课程

相似问题