简体   繁体   English

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

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

I've created a client, a server and an object called CcyData . 我创建了一个客户端,一个服务器和一个名为CcyData的对象。 When the client connects to the server I would like the server the send a "Welcome message" like "Hello, you are client# " + clientNumber . 当客户端连接到服务器时,我希望服务器发送“欢迎消息”,例如"Hello, you are client# " + clientNumber as a String and then send an object CcyData . 作为字符串,然后发送一个对象CcyData I've managed to get the sending of the CcyData object to work but when I try to read in the "Welcome message" with 我设法使CcyData对象的发送正常工作,但是当我尝试读取“欢迎消息”时,

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

the client stops working, nothing happens. 客户停止工作,没有任何反应。 No error message. 没有错误讯息。 Below is my code. 下面是我的代码。 How can I solve this? 我该如何解决?

Server. 服务器。

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();
        }
    }
}
}

Class ClientSocket 类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();
    }
}
}

Client 客户

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();
    }

}
}

finalize is only called when the JVM garbage collector decides that there are no more references to your thread and disposes it. 仅当JVM垃圾回收器确定不再有对线程的引用并进行处理时,才会调用finalize。 Thus, you cannot ensure that finalize will be called when your thread has reached the end of its run() method. 因此,您不能确保在线程到达其run()方法末尾时将调用finalize。 Try closing the socket in the run method instead! 尝试改为使用run方法关闭套接字!

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

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