【问题标题】:Reading data from a socket java从套接字java读取数据
【发布时间】:2016-02-20 13:05:13
【问题描述】:

所以,我正在尝试从套接字读取数据。我已经建立了一个连接并向正在监听的另一个套接字发送了一条消息,但它似乎没有收到任何东西。 客户端代码:

import java.net.*;
import java.io.*;
import java.util.*;
public class TCPClient {
 /*Conecting to server.
 */
 public static void Client(String[] args){
  int port = 47361;
  Scanner in = new Scanner(System.in);
  System.err.print("Starting up...");
  Socket CS1 = null; //Declaring CS1 as a socket
  DataOutputStream DOS1 = null; //Declaring an outputput data stream "DOS1"
  DataInputStream DIS1 = null; //Setting the values to null
  System.err.println("All created.");
  System.out.println("---------");
  System.out.println(" OPTIONS");
  System.out.println("---------");
  System.out.println("0. Connect.");
  System.out.println("1. Change port.");
  System.out.println("2. Cancel start-up.");
  System.out.println("");
  System.out.println("Choose an option.");
  try {
   short ans = in.nextShort();
   if (ans == 2){
    System.err.println("System.exit(0)");
    System.exit(0);
   }
   if (ans == 1){
     System.out.print("Enter the new port: ");
     port = in.nextInt();
     ans = 0;
   }
   if (ans == 0){
    System.out.print("Enter the IP: ");
    CS1 = new Socket(in.next(), port); //Creating an instane of the "CS1" socket
    System.err.print("Request sent on port " + port + ".");
    DOS1 = new DataOutputStream(CS1.getOutputStream());
    DIS1 = new DataInputStream(CS1.getInputStream()); //creating output and input streams
    System.err.println("Instances created!");
    if (DIS1 != null){
     System.err.println("DIS1 is connected!");
    }
    else {
     System.err.println("DIS1 is null!");
    }
    if (DOS1 != null) {
     System.err.println("DOS1 is connected!");
     System.out.print("Enter input: ");
     String FirstMessage = in.nextLine();
     DOS1.writeBytes(FirstMessage);
     String SecondMessage = DIS1.readLine();
     System.out.println(SecondMessage);
     if (SecondMessage.equals(FirstMessage)) {
     }
     else {
      System.out.println("Please check the code, FirstMessage != SecondMessage");
      }
    }
    else {
     System.err.println("DOS1 is null!");
    }
    if (CS1 != null) {
     System.err.println("CS1 is connected!");
    }
    else {
     System.err.println("CS1 is null!");
    }
    DIS1.close();
    DOS1.close();
    CS1.close(); //closing everything
   }
  }
  catch (IOException e){
   System.err.println("IOException: " + e.getMessage());
  }
 }
}

服务器代码:

import java.net.*;
import java.io.*;
import java.util.*;
public class TCPServer {
 /*Connecting to client
  */
 public static void Server (String[] args) {
  System.err.print("Starting up...");
  ServerSocket SS1 = null;
  DataOutputStream DOS1 = null;
  DataInputStream DIS1 = null;//Setting the values to null
  System.err.println("All created.");
  Scanner in = new Scanner(System.in);
  try {
   SS1 = new ServerSocket(47361); //setting the socket SS1 to port 5000 and creating an instance
   System.err.print("Listening on port 47361...");
   Socket CS1 = SS1.accept(); //accepting the connection request
   DOS1 = new DataOutputStream(CS1.getOutputStream());
   DIS1 = new DataInputStream(CS1.getInputStream());//creating output and input streams
   System.err.println("Instances created!");
   if (DIS1 != null){
    System.err.println("DIS1 is connected!");
    System.err.println(DIS1);
   }
   else {
    System.err.println("DIS1 is null!");
   }
   if (DOS1 != null) {
    System.err.println("DOS1 is connected!");
    System.err.println(DOS1);
   }
   else {
    System.err.println("DOS1 is null!");
   }
   if (SS1 != null) {
    System.err.println("SS1 is connected!");
    System.err.println(SS1);
   }
   else {
    System.err.println("SS1 is null!");
   }
   String FirstMessage = null;
   FirstMessage = DIS1.readLine();
   System.out.println(FirstMessage);
   String SecondMessage = FirstMessage;
   DOS1.writeBytes(SecondMessage);
   DIS1.close();
   DOS1.close();
   SS1.close(); //closing everything
  }
  catch (IOException error){
   System.err.println("IOException " + error.getMessage());
  }
catch (java.util.InputMismatchException error2){
   System.err.println("IOException " + error2.getMessage());
  }
 }
}

到目前为止,它几乎是一个 EchoServer,没有缓冲。我查看了调试器,它卡在服务器的FirstMessage = DIS1.readLine(); 行和客户端的String SecondMessage = DIS1.readLine(); 上。此外,即使在我输入了任何可能的输入之后,服务器和客户端都在等待输入。为什么会发生这种情况?我怎样才能做到这一点?

附注:我知道 i/o 流或套接字永远不会等于 null。此外,编译器警告我 java.io.DataInputStream 类已被弃用。您还推荐使用哪些其他类?

另外一个说明:我是 IO 新手,请不要因此而杀了我哈哈 :)

谢谢!

【问题讨论】:

  • 如果没有异常,new的结果不能为空。所有这些 null 测试都是完全没有意义的。
  • 是的,我提到我知道这一点。 “附注:我知道 i/o 流或套接字永远不会等于 null。”
  • 这不是真的,也不是我说的。它可以为空,但不能在您测试它的地方。不要用无意义的垃圾把你的代码弄得乱七八糟。

标签: java sockets io readline data-stream


【解决方案1】:

常见问题。你在读台词,但你不是在写台词。写入时在消息中添加行终止符。

【讨论】:

  • 我做了String FirstMessage = in.nextLine() + "\n\r"; 并重新运行程序:它打印了Enter input: null 行。什么、为什么以及如何?
  • readLine() 识别的行终止符是\n\r\r\n。请参阅 Javadoc。您使用的那个不是我自 1971 年以来使用过的任何计算机系统上的行终止符。请参阅here 了解为什么不这样做。
  • 所以我需要使用'String FirstMessage = in.nextLine() + "\r\n";' ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 2014-06-07
  • 1970-01-01
  • 2012-07-08
相关资源
最近更新 更多