关于ObjectIutputStream的问题
程序为 客户端与服务器相互通信,传输信息使用的是ObjectOutputStream和ObjectInputStream,问题是在客户端已经修改好的信息,服务器端接收到却是修改前的信息,我在客户端发送前打印发送的内容,确实是修改后的内容
程序代码如下:
//Server
import java.io.*;
import java.net.*;
import java.util.*;
import java.awt.*;
import javax.swing.*;
public class Reader extends JFrame{
private final int ServerPort = 2222;
private JTextArea jta = new JTextArea();
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new Reader();
}
public Reader(){
setLayout(new BorderLayout());
add(new JScrollPane(jta), BorderLayout.CENTER);
setTitle("Reader");
setSize(500,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
try{
ServerSocket serverSocket = new ServerSocket(ServerPort);
jta.append("Reader Server started at " + new Date() + '\n');
int clientNo = 1;
while(true){
Socket socket = serverSocket.accept();
jta.append("Starting thread for client" + clientNo + " at " + new Date() + '\n');
InetAddress inetAddress = socket.getInetAddress();
jta.append("Client " + clientNo + "'s host name is " + inetAddress.getHostName() + '\n');
jta.append("Client " + clientNo + "'s IP Address is " + inetAddress.getHostAddress() + '\n');
HandleAClient task = new HandleAClient(socket);
new Thread(task).start();
clientNo++;
}
}
catch(IOException ex){
System.err.println(ex);
}
}
class HandleAClient implements Runnable{
private Socket socket;
public HandleAClient(Socket socket){
this.socket = socket;
}
public void run(){
try{
ObjectOutputStream outputToClient = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream inputFromClient = new ObjectInputStream(socket.getInputStream());
//建立发送信息 对象
Message message = new Message('m',"");
while(true){
System.out.println(message.getIdentifier());
Object object = inputFromClient.readObject();
message.setIdentifier(((Message)object).getIdentifier());
message.setMessage(((Message)object).getMessage());
System.out.println("收到");
System.out.println(message.getIdentifier());
if(message.getIdentifier() == 's'){
//生成随机数
double randomNumber = Math.floor(Math.random() * 100);
System.out.println(randomNumber);
//转换成二进制
String binNumber = Integer.toBinaryString((int)randomNumber);
//发送随机数
message.setIdentifier('r');
message.setMessage(binNumber);
System.out.println(binNumber);
}
if(message.getIdentifier() == 'a'){
message.setIdentifier('o');
message.setMessage("Over");
}
outputToClient.writeObject(message);
outputToClient.flush();
}
}
catch(IOException e){
System.err.println(e);
}
catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//client
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Label extends JFrame{
private final int ServerPort = 2222;
private JTextField jtf = new JTextField();
private JTextArea jta = new JTextArea();
private ObjectOutputStream toServer;
private ObjectInputStream fromServer;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new Label();
}
public Label(){
JPanel p = new JPanel();
p.setLayout(new BorderLayout());
p.add(new JLabel("Enter radius"), BorderLayout.WEST);
p.add(jtf, BorderLayout.CENTER);
jtf.setHorizontalAlignment(JTextField.RIGHT);
setLayout(new BorderLayout());
add(p,BorderLayout.NORTH);
add(new JScrollPane(jta), BorderLayout.CENTER);
//jtf.addActionListener(new ButtonListener());
setTitle("Label");
setSize(500,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
try{
Socket socket = new Socket("localhost", ServerPort);
toServer = new ObjectOutputStream(socket.getOutputStream());
fromServer = new ObjectInputStream(socket.getInputStream());
Message message = new Message('s',"成功连接");
while(true){
System.out.println(message.getIdentifier());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
toServer.writeObject(message);
toServer.flush();
Object object = fromServer.readObject();
message.setIdentifier(((Message)object).getIdentifier());
message.setMessage(((Message)object).getMessage());
System.out.println("收到来自Server " + message.getIdentifier() + ' ' + message.getMessage() + '\n');
if(message.getIdentifier() == 'r'){
//hash(ID+R)
message.setIdentifier('a');
message.setMessage("hash信息");
}
if(message.getIdentifier() == 'o'){
System.out.println(message.getMessage());
socket.close();
}
}
}
catch(IOException ex){
jta.append(ex.toString() + '\n');
System.err.println(ex);
}
catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
代码里涉及到的message 为
public class Message implements java.io.Serializable{
private char identifier;
private String message;
public Message() {
super();
// TODO Auto-generated constructor stub
}
public Message(char identifier, String message) {
super();
this.identifier = identifier;
this.message = message;
}
public char getIdentifier() {
return identifier;
}
public void setIdentifier(char identifier) {
this.identifier = identifier;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
后来发现 客户端接受到服务器端修改后的信息,客户端这边打印出来也是修改前的信息。不知道是什么问题
表达的可能有些繁琐,大大们运行下代码就知道了,希望给于帮助,谢谢