0

我有一个简单的 UDP 服务器和客户端。服务器使用该readInDataFile() 方法用文本文件中的所有字符串填充数组列表。我的服务器可以轻松地从字节中读取字符串 "dis.readUTF(); "extracted = dis.readUTF();" ,我的客户端可以轻松地使用dis.writeUTF();

我遵循相同的结构和逻辑将从数组中找到的字符串发送到客户端,但它没有收到任何内容。

*我的问题:为什么客户端没有正确读取字符串?我知道服务器正在正确读取年份,因为我有一个打印语句来使用发送的字符串并进入 arrayList 以确定我们要打印的内容。

我正在读取的 .txt 文件的字符串从 1875 开始一直到 2011 年,因此如果客户端输入“2011”,它将传递给服务器,服务器将进入 .txt 文件并检索“2011”动物王国约翰·委拉斯开兹 2:02.04"

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import java.util.Scanner;

public class DerbyUDPClient {

    public InetAddress ip = null;

    // To print the string at the end
    String finalPrint = "";
    // Socket for UDP communication with server
    DatagramSocket dgs = null;
    DatagramSocket dgs2 = null;

    // The DataGramPacket used with server
    DatagramPacket dgp = null;
    DatagramPacket dgp2 = null;

    ByteArrayOutputStream bos = null;
    DataOutputStream dos = null;

    String year = "";

    // The String to hold the user's IP Address
    String ipString = "";
    Scanner input = new Scanner(System.in);

    public DerbyUDPClient() throws IOException {
        getIPAddressServerAndYear();

    }

    public void getIPAddressServerAndYear() throws IOException {

        // Ask user for IP address, or they can just press return 
        System.out.println("Enter the IP Address of the server, please: ");
        ipString = input.nextLine();

        if (ipString.length() == 0) {

            ipString = "127.0.0.1";
        }

        try {
            ip = InetAddress.getByName(ipString);
        } catch (UnknownHostException e) {

            e.printStackTrace();
        }

        // Ask user for IP address, or they can just press return 
        System.out.println("Please enter a year between 1875 and 2011: ");

        year = input.nextLine();

        // Checks to see if the user has inputed a year 
        if (isInteger(year) == true) {

            // write and then receive

            dgs = new DatagramSocket();

            bos = new ByteArrayOutputStream();

            dos = new DataOutputStream(bos);

            dos.writeUTF(year);


            dgp = new DatagramPacket(bos.toByteArray(), bos.size());

            dgp.setAddress(InetAddress.getLocalHost());
            dgp.setPort(28150);

            dgs.send(dgp);

            // receive


            dgs.receive(dgp);

            ByteArrayInputStream bis = new ByteArrayInputStream(dgp.getData());

            DataInputStream dis = new DataInputStream(bis);
            finalPrint = dis.readUTF();
            System.out.println(finalPrint);

            dgs.close();
        }

    }

    public boolean isInteger(String input) {
        try {
            Integer.parseInt(input);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public static void main(String[] args) throws IOException {

        new DerbyUDPClient();

    } // end main

} // end DerbyUDPClient


<><><><><><><><><><><><><><><><><><><><><><>><>><><><><>><><><> New class below
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;

public class DerbyUDPServer {

    // Socket for UDP communication with clients
    DatagramSocket dgs = null;
    DatagramSocket dgs2 = null;

    // The DataGramPacket used
    DatagramPacket dgp = null;

    ByteArrayInputStream bis = null;

    DataInputStream dis = new DataInputStream(bis);

    int clientPort = 0;

    DatagramPacket dgp2 = null;

    // The string converted to an int is held in this variable
    int parsedString = 0;

    // Flag set to false when server should close
    boolean listening = true;

    // The String that is used to hold the extracted String
    String extracted = "";

    // Total number of clients server has sent data to
    int clientCount = 0;

    // Port number that server listens on
    static final int SERVER_PORT = 31250;

    ByteArrayOutputStream bos = null;
    DataOutputStream dos = null;

    // Array list containing a list of strings describing
    // Kentucky derby winners
    ArrayList<String> winners = new ArrayList<String>();

    public DerbyUDPServer() throws IOException {

        readInDataFile();
        handleClients();

    } // end DerbyUDPServer constructor

    protected void readInDataFile() throws IOException {
        int winIdx = 0;
        String singleWinner;

        BufferedReader in = new BufferedReader(new FileReader("derby.txt"));

        while ((singleWinner = in.readLine()) != null) {

            winners.add(singleWinner);
            winIdx++;
        }

        in.close();

    } // end readInDataFile

    /*
     * Displays IP address and port number that clients can use to contact the
     * server to the console.
     */
    protected void displayContactInfo() {
        try {
            // Display contact information.
            System.out.println("Number Server standing by to accept Clients:"
                    + "\nIP : " + InetAddress.getLocalHost() + "\nPort: "
                    + dgs.getLocalPort() + "\n\n");

        } catch (UnknownHostException e) {
            // NS lookup for host IP failed?
            // This should only happen if the host machine does
            // not have an IP address.
            e.printStackTrace();
        }

    } // end displayContactInfo

    public void handleClients() throws IOException {

        try {

            dgs = new DatagramSocket(28150);

            dgp = new DatagramPacket(new byte[50], 50);

        } catch (SocketException e) {

            e.printStackTrace();

        }

        displayContactInfo();

        // Receive and then write

        // receive here

        dgs.receive(dgp);

        // Prints out the IP address and Port of the DataGramPacket 
        System.out.println(dgp.getAddress());
        System.out.println(dgp.getPort());

        // Extract the string from the bytes 

        ByteArrayInputStream bis = new ByteArrayInputStream(dgp.getData());

        DataInputStream dis = new DataInputStream(bis);
        // Read in the string from the DataInputString...
        try {
            extracted = dis.readUTF();
        } catch (IOException e) {

            e.printStackTrace();
        }

        // System.out.println("You entered the year: " + extracted);
        // Converts the String to an integer 
        parsedString = Integer.parseInt(extracted);

        // This below prints, so I am obviously receiving the integer year from the client

         System.out.println(getYearLine(parsedString));

        // Write below

        bos = new ByteArrayOutputStream();

        dos = new DataOutputStream(bos);

        dos.writeUTF(getYearLine(parsedString));

        dgp2 = new DatagramPacket(bos.toByteArray(), bos.size());

        dgp2.setAddress(dgp.getAddress());
        dgp2.setPort(dgp.getPort());

        dgs.send(dgp2);

        while(listening == true){
            handleClients();
        }

    }

    public String getYearLine(int year) {

        if (year < 2012 && year > 1874) {

            return winners.get(2011 - year);

        } else {

            return "no derby info for that year";
        }

    } // getYearLine

    public static void main(String[] args) throws IOException {

        new DerbyUDPServer();

    } // end main

} // end DerbyUDPServer
4

0 回答 0