【发布时间】:2015-09-02 05:52:19
【问题描述】:
我是 Socket 编程的新手。我想使用 Socket 将 Person 类的对象发送到服务器。 Server Socket有一个例外。
班人如下:
import java.awt.Image;
import java.io.Serializable;
public class Person implements Serializable {
private String name;
private String id;
public Person() {}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Person(String name, String id) {
super();
this.name = name;
this.id = id;
}
}
我首先运行我的服务器。服务端代码如下:
import java.io.*;
import java.net.*;
public class Server extends Thread {
ServerSocket serverSocket;
Socket socket;
ObjectInputStream inStream=null;
ObjectOutputStream outStream=null;
public void run(){
try{
serverSocket=new ServerSocket(2004);
socket=serverSocket.accept();
this.outStream=new ObjectOutputStream(socket.getOutputStream());
outStream.flush();
this.inStream=new ObjectInputStream(socket.getInputStream());
while(true){
System.out.println("recieving data");
Person person=(Person)this.inStream.readObject();
//queue.put(person);
System.out.println(person.getName()+" "+person.getId());
}
}
catch(EOFException e){
}
catch(IOException e){
e.printStackTrace();
}
catch(ClassNotFoundException e){
e.printStackTrace();
}
}
public static void main(String args[]){
new Server().start();
}
}
然后我运行我的客户端。其代码如下。
import java.io.*;
import javax.swing.*;
import javax.swing.JLabel;
import javax.swing.tree.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.util.LinkedList;
public class Client {
Socket socket;
ObjectInputStream inStream=null;
ObjectOutputStream outStream=null;
String ip="localhost";
boolean connected=false;
public Client(String ip){
this.ip=ip;
}
public Client(){
}
public static void main(String args[]){
new Client().connect();
}
public boolean connect(){
try {
socket = new Socket(ip, 2004);
System.out.println("Client starting");
this.outStream=new ObjectOutputStream(socket.getOutputStream());
outStream.flush();
this.inStream=new ObjectInputStream(socket.getInputStream());
String name;
System.out.println("sending data");
outStream.writeObject(new Person("faisal ","232323"));
}catch(EOFException e){
JOptionPane.showMessageDialog(null,"EOFException");
System.out.println("I am inside Connector EOFException");
connected=false;
//System.out.println("PoolRunner Client side Disconnected");
}
catch (IOException e) {
JOptionPane.showMessageDialog(null, "IOException");
System.out.println("I am inside Connector IOException");
System.out.println(e);
connected=false;
}
finally{
return(connected);
}
}
public ObjectInputStream getObjectInputStream(){
return this.inStream;
}
public ObjectOutputStream getObjectOutputStream(){
return this.outStream;
}
public void disconnect(){
try{
this.inStream.close();
this.outStream.close();
this.socket.close();
}catch(IOException e){
JOptionPane.showMessageDialog(null,"Problem in closing streams or socket");
}
catch(Exception e){
JOptionPane.showMessageDialog(null,"Problem in closing streams or socket");
e.printStackTrace();
}
}
}
在服务器端抛出以下异常。
java.net.SocketException: Connection reset
【问题讨论】:
-
您能否提供堆栈跟踪(或至少在服务器上引发异常的哪一行)?另外,服务器是否打印了任何对象/接收数据/等?
-
这可能是因为客户端关闭了连接,而您的服务器仍在尝试从输入流中读取。
-
其实他从来没有关闭过连接...
-
@QuakeCore 客户端程序在写入对象后将退出,但服务器将继续读取,因为它使用无限循环。
-
大声笑我有一个答案,但无论我做什么,由于格式问题,我无法发布它