创建要传输的实体对象UserInfo:
package com.NIO.socket;
import java.io.Serializable;
public class UserInfo implements Serializable {
private long id;
private String userName;
private String password;
public UserInfo(){}
public UserInfo(long id,String userName,String password){
super();
this.id = id;
this.userName=userName;
this.password=password;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
服务端示例代码如下:
public class ObjectServer {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
for(int i =0;i<5;i++){
UserInfo userInfo = (UserInfo) objectInputStream.readObject();
System.out.println("在服务器端打印:"+userInfo.getId()+":"+userInfo.getUserName()+":"+userInfo.getPassword());
UserInfo newUserInfo = new UserInfo();
newUserInfo.setId(i+1);
newUserInfo.setUserName("serverUsername"+i);
newUserInfo.setPassword("serverPassword"+i);
objectOutputStream.writeObject(newUserInfo);
}
objectOutputStream.close();
objectInputStream.close();
outputStream.close();
inputStream.close();
socket.close();
serverSocket.close();
}
}
客户端示例代码如下:
public class ObjectClient {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Socket socket = new Socket("localhost",8888);
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
for(int i=0;i<5;i++){
UserInfo userInfo = new UserInfo();
userInfo.setId(i+1);
userInfo.setUserName("clientUsername"+i);
userInfo.setPassword("clientPassname"+i);
objectOutputStream.writeObject(userInfo);
UserInfo newUserinfo = (UserInfo) objectInputStream.readObject();
System.out.println("在客户端打印:"+newUserinfo.getId()+":"+newUserinfo.getUserName()+":"+newUserinfo.getPassword());
}
objectOutputStream.close();
objectInputStream.close();
outputStream.close();
inputStream.close();
socket.close();
}
}
运行服务器端和客户端结果服务器输出结果如下:
在服务器端打印:1:clientUsername0:clientPassname0
在服务器端打印:2:clientUsername1:clientPassname1
在服务器端打印:3:clientUsername2:clientPassname2
在服务器端打印:4:clientUsername3:clientPassname3
在服务器端打印:5:clientUsername4:clientPassname4
客户端输出结果如下:
在客户端打印:1:serverUsername0:serverPassword0
在客户端打印:2:serverUsername1:serverPassword1
在客户端打印:3:serverUsername2:serverPassword2
在客户端打印:4:serverUsername3:serverPassword3
在客户端打印:5:serverUsername4:serverPassword4
控制台输出的结果证明服务端和客户端传输Userinfo对象成功,但在这里需要注意的是,如果在服务端使用程序代码:
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
那么先获得 ObjectlnputStream 对象,然后获得 bjectOutputStream 对象。如果客户端 也使用同样顺序的代码:
Socket socket = new Socket("localhost",8888);
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
那么 客户端也是先获得 Obj ectlnputStream 象,然后获得 b j ectOutpu tS tr earn 这样的话,在运行程序时,会在服务端的程序代码:
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
出现阻塞的现象。正确的写法应该是
1 )服务端先获得 bjectlnputStream 客户端就要先获得 bjectOutputStream 对象
2)服务端先获得 Obj ectOutputS earn 对象,客户端就要先获得 ObjectinputStream 象。