簡體   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