我是Socket编程的新手。我想使用套接字将一个Person类的Object发送到服务器。服务器套接字有一个例外 上课人员如下:
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
答案 0 :(得分:1)
well your code had some flaws in it, such as not closing the connections, misplaced while loops, you know the usual stuff :)
Server.java
import java.io.*;
import java.net.*;
public class Server extends Thread {
ServerSocket serverSocket;
Socket socket;
ObjectInputStream inStream = null;
ObjectOutputStream outStream = null;
public Server() {
}
public void run() {
try {
serverSocket = new ServerSocket(2004);
while (true) {
socket = serverSocket.accept();
this.outStream = new ObjectOutputStream(
socket.getOutputStream());
outStream.flush();
this.inStream = new ObjectInputStream(socket.getInputStream());
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();
}
}
Client.java
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import javax.swing.JOptionPane;
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 void connect() {
try {
socket = new Socket(ip, 2004);
System.out.println("Client starting");
this.outStream = new ObjectOutputStream(socket.getOutputStream());
connected = true;
String name;
System.out.println("sending data");
outStream.writeObject(new Person("faisal ", "232323"));
outStream.flush();
} 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 {
if (connected) {
disconnect();
}
}
}
public ObjectOutputStream getObjectOutputStream() {
return this.outStream;
}
public void disconnect() {
try {
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();
}
}
}
答案 1 :(得分:0)
Your client doesn't do anything with the socket after sending the object, it just quits. If you don't close a connection properly before ending the process, the operating system gets confused and will just reset the connection.
You'll need to call shutdownOutput() and close() on the socket.
See also purpose of socket.shutdownOutput()
答案 2 :(得分:0)
In Client.java, change main to the following:
public static void main(String args[]){
Client cl = new Client();
cl.connect();
cl.disconnect();
}
This makes your client close its connections to the server before closing. This helps prevent the OS from resetting the connection as mentioned by escitalopram