陈婉
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类是抛出的异常如图片所示
你的代码写错了,服务器端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());
你可以在那行提示空指针的下面在写一个}catch(NullPointerException e ){这样就可以避免了,可以通过添加多个catch语句来规避遇到的多个异常。
Java Socket应用---通信是这样练成的
125006 学习 · 596 问题
相似问题