关于ObjectIutputStream的问题

safadq 2012-04-12 12:20:05
程序为 客户端与服务器相互通信,传输信息使用的是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;
}
}
后来发现 客户端接受到服务器端修改后的信息,客户端这边打印出来也是修改前的信息。不知道是什么问题

表达的可能有些繁琐,大大们运行下代码就知道了,希望给于帮助,谢谢
...全文
42 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

58,454

社区成员

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

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