java - Java 编写客户端到服务器

标签 java sockets io

我需要帮助。我正在制作一个示例队列系统。 当我尝试写入数据并将其存储到服务器时,服务器返回异常。 我也是套接字新手,因此我将感谢任何能够回答我的问题的人提供的帮助。

这是我的学生代码:

import java.lang.*;
import java.io.*;
import java.net.*;
import java.util.*;

public class Student {
   public static void main(String args[]) {
      Scanner sc = new Scanner (System.in);
  try {
     Socket skt = new Socket("localhost", 1234);
     PrintWriter out = new PrintWriter(skt.getOutputStream(), true);

     System.out.println("Hello!");

     System.out.print("Please enter name: ");
     String name = sc.next();
     System.out.print("Please enter ID Number: ");
     String id = sc.next();
     String student = name +" - "+ id;
     out.print(student);

      } catch(Exception e) {
          System.out.println("Whoops! It didn't work.");
      }
   }
}

对于服务器:

import java.lang.*;
import java.io.*;
import java.net.*;
import java.util.*;

public class Server {
   public static void main(String args[]) {
      Scanner sc = new Scanner (System.in);
      ArrayList<String> collector = new ArrayList<String>();

  try {
     ServerSocket srvr = new ServerSocket(1234);
     Socket skt = srvr.accept();
     BufferedReader in = new BufferedReader(new InputStreamReader(skt.getInputStream()));

     System.out.print(in.readLine());
     String x = in.readLine();
     collector.add(x);


      }
      catch(Exception e) {
         System.out.print("Whoops! It didn't work!\n");
      }
   }
}

最佳答案

您需要在 PrintWriter 执行完成之前添加“out.close()”语句来正确关闭它。由于您没有这样做,因此客户端套接字突然关闭,并且您在服务器端收到异常。

理想情况下,这个 close() 应该在 finally block 内执行,以便确保它被执行。另外,正如另一个答案中指出的那样,您应该只读取一次,将其存储在变量中,然后对该值执行任何您需要的操作。

示例:

public class Server {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        ArrayList<String> collector = new ArrayList<String>();

        try {
            ServerSocket srvr = new ServerSocket(1234);
            Socket skt = srvr.accept();
            BufferedReader in = new BufferedReader(new InputStreamReader(skt.getInputStream()));

            final String studentInfo = in.readLine();
            System.out.print(studentInfo);
            collector.add(studentInfo);

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Whoops! It didn't work!");
        }
    }
}

学生:

public class Student {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        PrintWriter out = null;
        try {
            Socket skt = new Socket("localhost", 1234);
            out = new PrintWriter(skt.getOutputStream(), true);

            System.out.println("Hello!");

            System.out.print("Please enter name: ");
            String name = sc.next();
            System.out.print("Please enter ID Number: ");
            String id = sc.next();
            String student = name + " - " + id;
            out.print(student);
        } catch (Exception e) {
            System.out.println("Whoops! It didn't work.");
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (Exception e) {

                }
            }
        }
    }
}

关于java - Java 编写客户端到服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22221839/

相关文章:

java - WebSocket 握手 - 意外的响应代码 200 - AngularJs 和 Spring Boot

c++ - SDL PollEvent() 从不返回任何内容

c - 在 Unix 上使用 C 从文件描述符读取/写入 N 个字节

java - 配置 Jackson 而不是使用 DateTimeFormat.ISO.DATE - 不工作

java - 我可以同时使用默认构造函数和@UiConstructor吗?

java - 如何克隆TestNG的TestResult

java - 如何在 Java 1.4 中设置 BufferedReader 和 PrintWriter 的超时?

c - ws ://in a C program

sockets - 如何使用 python 在 ssl/tls 套接字连接中获取域的 IP

python - 如何使用 ftplib 在远程服务器上创建 .txt 文件并使用变量在其中放置一些字符串?