繁体   English   中英

Java套接字连接接收和发送String和Object

[英]Java socket connection receiving and sending String and Object

我创建了一个客户端,一个服务器和一个名为CcyData的对象。 当客户端连接到服务器时,我希望服务器发送“欢迎消息”,例如"Hello, you are client# " + clientNumber 作为字符串,然后发送一个对象CcyData 我设法使CcyData对象的发送正常工作,但是当我尝试读取“欢迎消息”时,

input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("Welcome message from server: "+ input.readLine());

客户停止工作,没有任何反应。 没有错误讯息。 下面是我的代码。 我该如何解决?

服务器。

package net.something;

import java.io.IOException;
import java.net.ServerSocket;


public class SocketServer {

private ServerSocket serverSocket = null;
private int clientNumber = 0;

public SocketServer() {
}

public void listenSocket () {
    int clientNumber = 0;

    try{
        serverSocket = new ServerSocket(9090);
        System.out.println("Server started on port 9090");
    } catch(IOException e) {
        e.printStackTrace();
    }

    while (true) {
        ClientSocket clientSocket;
        try{
            clientSocket = new ClientSocket(serverSocket.accept(), serverSocket, clientNumber++);
            Thread thread = new Thread(clientSocket);
            thread.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
}

类ClientSocket

package net.something;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class ClientSocket implements Runnable {
private Socket clientSocket;
private ServerSocket serverSocket;
private int clientNumber;

public ClientSocket(Socket clientSocket, ServerSocket serverSocket, int clientNumber) {
    this.clientSocket = clientSocket;
    this.serverSocket = serverSocket;
    this.clientNumber = clientNumber;
    System.out.println("New connection with client# " + clientNumber + " at " + clientSocket);
    }

public void run() {

    PrintWriter out;
    ObjectOutputStream outObjectStream;

    try {
        out = new PrintWriter(clientSocket.getOutputStream());
        out.println("Hello, you are client# " + clientNumber);
        outObjectStream = new ObjectOutputStream(clientSocket.getOutputStream());
        CcyData ccyData = new CcyData("EUR", 9.56);
        System.out.println("CcyData: " + ccyData.getCcy() + " " + ccyData.getFxRate());
        outObjectStream.writeObject(ccyData);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void finalize() {
    try{
        serverSocket.close();
        System.out.println("Server socket closed");
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

客户

package net.something;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.net.Socket;

public class SocketClient {

private Socket socket = null;
private BufferedReader input;
private ObjectInputStream inObjectStream = null;

public SocketClient() {
}

public void connectToServer() {

    try{
        socket = new Socket("127.0.0.1", 9090);
        input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        System.out.println("Welcome message from server: "+ input.readLine());
        inObjectStream = new ObjectInputStream(socket.getInputStream());
        CcyData ccyData = (CcyData) inObjectStream.readObject();
        System.out.println(ccyData.getCcy() + " " + ccyData.getFxRate());
    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
    }

}
}

仅当JVM垃圾回收器确定不再有对线程的引用并进行处理时,才会调用finalize。 因此,您不能确保在线程到达其run()方法末尾时将调用finalize。 尝试改为使用run方法关闭套接字!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM