Intellij Idea 如何将数据发送到服务器,并将输出返回给客户端?

oiopk7p5  于 2023-10-15  发布在  其他
关注(0)|答案(1)|浏览(129)

我必须使用TCP套接字编程来创建一个将两个数字相加的应用程序。该操作必须发生在服务器上,该服务器接受两个数字并返回结果。因此,解决方案必须包含两个组件:服务器和客户端。在客户端中,必须允许用户使用Scanner类输入两个数字。值必须放在变量中,然后发送到应用程序的服务器端。值可以一起发送或单独发送。在接受该值之后,服务器应该将这些数字相加,并将结果发送给客户端。结账时必须显示所获得的金额。
客户端

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.Scanner;
public class Client {
    public static void main(String[] args) {
    try (Socket socket = new Socket("www.google.com", 80);
    BufferedReader bis = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream())) {
        bos.write("Get /search?q=java HTTP/1.1\r\n\r\n".getBytes());
        Scanner input = new Scanner(System.in);
        System.out.println("Insert number x.");
        int x = input.nextInt();
        System.out.println("Insert number y.");
        int y = input.nextInt();
        bos.flush();
    } catch (IOException exc) {
        System.out.println(exc.getMessage());
        }
    }
}

服务器

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
    public static void main(String[] args) {
        System.out.println("Listening.");
        try (ServerSocket server = new ServerSocket(1080);
             Socket s = server.accept();
             BufferedReader bis = new BufferedReader(new InputStreamReader(s.getInputStream()));
             BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream())) {
            System.out.println("Connected.");
            int x = Integer.parseInt(bis.readLine());
            int y = Integer.parseInt(bis.readLine());
            int z = x + y;
            bos.write(("The amount is:" + z).getBytes());
        } catch (IOException exc) {
            System.out.println(exc.getMessage());
        }
    }
}

但是我在控制台中得到这个错误:

Exception in thread "main" java.lang.NumberFormatException: For input string: "GET / HTTP/1.1"
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
    at java.base/java.lang.Integer.parseInt(Integer.java:665)
    at java.base/java.lang.Integer.parseInt(Integer.java:781)
    at Server.main(Server.java:15)

我做错了什么?我想我得到了服务器部分的权利,但我不知道如何处理客户端。多谢了!

wsxa1bj1

wsxa1bj11#

try (Socket socket = new Socket("www.google.com", 80);

没有意义,我很确定你不是在问谷歌答案。
你的委托人做的第一件事就是写...

bos.write("Get /search?q=java HTTP/1.1\r\n\r\n".getBytes());

但你的服务器做的第一件事就是读取

int x = Integer.parseInt(bis.readLine());

所以你试图写一个String,但读一个int,因此你的问题的核心。
现在,除非您打算编写自己的http服务器,否则不需要发送前导get ...
我也会使用BufferedWriter,而不是BufferedOutputStream,这只是为了让你的生活更轻松。
所以,让我们从更新Server开始。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        System.out.println("Listening.");
        try (
                ServerSocket server = new ServerSocket(1080); Socket s = server.accept(); 
                BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 
                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()))) {
            System.out.println("Connected.");
            int x = Integer.parseInt(br.readLine());
            int y = Integer.parseInt(br.readLine());
            int z = x + y;
            bw.write("The amount is:" + z);
            bw.newLine();
            bw.flush();
        } catch (IOException exc) {
            System.out.println(exc.getMessage());
        }
    }
}

现在Client

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) {
        try (
                Socket socket = new Socket("localhost", 1080); 
                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))) {
            Scanner input = new Scanner(System.in);
            System.out.println("Insert number x.");
            int x = input.nextInt();
            bw.write(Integer.toString(x));
            bw.newLine();
            System.out.println("Insert number y.");
            int y = input.nextInt();
            bw.write(Integer.toString(y));
            bw.newLine();
            bw.flush();

            String result = br.readLine();
            System.out.println(result);
        } catch (IOException exc) {
            System.out.println(exc.getMessage());
        }
    }
}

这假设服务器和客户端运行在同一台机器上,如果不是,那么您需要将Socket地址更改为与运行Server的计算机的IP地址(或主机名)相同。
现在,当我运行它时(确保先启动Server),我得到.

Insert number x.
1
Insert number y.
1
The amount is:2

相关问题