如何在java中使用套接字发送/接收对象
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/27736175/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
how to send/receive Objects using sockets in java
提问by Ismail Addou
When I execute my code in the CMD window, it doesn't work in Client mode, exactly at the line:
当我在 CMD 窗口中执行我的代码时,它在客户端模式下不起作用,正好在行:
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
the program block on this line but don't stop or signal error :
此行上的程序块,但不要停止或发出错误信号:
I have 3 classes: Client
, Server
, Message
我有 3 个班级:Client
, Server
,Message
ClientClass:
客户端类:
package client;
// Organize imports
public class Client {
public static void main(String[] args) throws UnknownHostException,
IOException, ClassNotFoundException {
System.out.println("welcome client");
Socket socket = new Socket("localhost", 4444);
System.out.println("Client connected");
ObjectOutputStream os = new ObjectOutputStream(socket.getOutputStream());
System.out.println("Ok");
Message message = new Message(new Integer(15), new Integer(32));
os.writeObject(message);
System.out.println("Envoi des informations au serveur ...");
ObjectInputStream is = new ObjectInputStream(socket.getInputStream());
Message returnMessage = (Message) is.readObject();
System.out.println("return Message is=" + returnMessage);
socket.close();
}
}
Server
服务器
Here is the code of the Server
class
这是Server
类的代码
package Sockets;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static final int port = 4444;
private ServerSocket ss = null;
public void runServer() throws IOException, ClassNotFoundException{
ss = new ServerSocket(port);
System.out.println("le systeme est pret pour accepter les connexions");
Socket socket = ss.accept();
ObjectInputStream is = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream os = new ObjectOutputStream(socket.getOutputStream());
Message m = (Message) is.readObject();
doSomething(m);
os.writeObject(m);
socket.close();
}
private void doSomething(Message m) {
m.setResult(new Integer(m.getA().intValue()*m.getB().intValue()));
}
public static void main(String[] args) throws ClassNotFoundException, IOException {
new Server().runServer();
}
}
Message
信息
And here is my object , I made it Serializable
by implementing the interface Serializable
这是我的对象,我是Serializable
通过实现接口来实现的Serializable
import java.io.Serializable;
public class Message implements Serializable {
private static final long serialVersionUID = -5399605122490343339L;
private Integer A;
private Integer B;
private Integer Result;
public Message(Integer firstNumber, Integer secondNumber ){
this.A = firstNumber;
this.B = secondNumber;
}
public Integer getA() {
return A;
}
public Integer getB() {
return B;
}
public void setResult(Integer X) {
Result = X;
}
}
采纳答案by user207421
You need to create the ObjectOutputStream
before the ObjectInputStream
, at both ends, for reasons described in the Javadoc concerning the object stream header.
由于 Javadoc 中描述的有关对象流标头的原因,您需要ObjectOutputStream
在ObjectInputStream
, 两端之前创建。