【问题标题】:Simple Client Server Java Program not going into while loop简单的客户端服务器 Java 程序不进入 while 循环
【发布时间】:2017-04-18 17:18:50
【问题描述】:

我在做作业时偶然发现了一个死块。这是一个简单的服务器和客户端程序。 该方案的具体内容如下;

  1. 创建一个监听传入连接的服务器类EncryptServer。如果有连接,接受它并创建一个线程EncryptServerSession 来处理输入和输出流。
  2. 创建一个线程类EncryptServerSession,从服务器类接收输入和输出流并进行处理。
  3. 创建一个客户端类EncryptClient,它连接到服务器类并从EncryptServerSessionEncryptServer 获取输出流。

不知何故,EncryptClient 类的 while true 循环不起作用。我似乎无法进入循环。我的代码有问题吗?提前致谢。

加密服务器

import java.net.*;
import java.io.*;

public class EncryptServer
{    
    public EncryptServer() throws IOException
    {
         ServerSocket serverSocket = new ServerSocket(1122);
         System.out.println("Server started."); 
     
         while (true)
         {
             Socket conSocket = serverSocket.accept();
             System.out.println("Client connected from " + 
conSocket.getLocalAddress().getHostName()); 
         
             Thread session = new 
EncryptServerSession(conSocket.getInputStream(), 
conSocket.getOutputStream());
             session.start();
         }
    }
    public static void main(String[] args)
    {
        try
        {
            EncryptServer server = new EncryptServer();
        }
        catch (Exception e)
        {
            System.out.println(e);
        }                                      
    }      
}

加密服务器会话

import java.net.*;
import java.io.*;

public class EncryptServerSession extends Thread
{
    BufferedReader in;
    Writer out;

    public EncryptServerSession(InputStream inStream, OutputStream outStream)
    {
        Reader read = new InputStreamReader(inStream);
        in = new BufferedReader(read);
        out = new OutputStreamWriter(outStream);
    }
    
    public void strEncrypt()
    {
        try
        {
            String message = in.readLine();
            out.write(message);
            out.flush();
        }
        catch (Exception e)
        {
        }
    }
    
    public void run()
    {
        try
        {
            //System.out.println(in.readLine());
            out.write("Please enter the message to be encrypted: ");
            out.flush();
            
            //strEncrypt();
        
        }
        catch (Exception e)
        {
            System.out.println(e);
        }        
    }
}

加密客户端

import java.net.*;
import java.io.*;

public class EncryptClient
{
    BufferedReader input, userTerm;
    Writer output;
    String line;
    
    public EncryptClient() throws IOException
    {
        Socket clientSocket = new Socket("localhost", 1122);
        Reader read = new InputStreamReader(clientSocket.getInputStream());
        input = new BufferedReader(read);
        
        userTerm = new BufferedReader(new InputStreamReader(System.in));
        output = new OutputStreamWriter(clientSocket.getOutputStream());             
        
        /////////////// Somehow I cannot get into this loop, why? //////////
        while (true) 
        {
            System.out.println("test ");
            System.out.println(input.readLine());
            System.out.println("Enter message to be encrypted: ");
            output.write(userTerm.readLine());        
            output.flush();
        }
        /////////////// Somehow I cannot get into this loop, why? //////////
    }
    
    public static void main(String[] args)
    {
        try
        {
          EncryptClient client = new EncryptClient();
        }
        catch (Exception e)
        {
            System.out.println(e);
        }
    }
}

【问题讨论】:

  • 您能否通过您的 EncryptClient 构造函数并添加 System.out.pritnln("test");或者每一行(一个接一个)上的类似的东西?确切地知道它挂断在哪一行代码会很有帮助。
  • 您是否在运行 EncryptClient 的 main 方法之前运行了 EncryptServer 的 main 方法?如果不是,则可能是这种情况,因为您应该先运行服务器,然后再运行客户端。顺便说一句,执行后控制台中的输出是什么?
  • 我曾经在我的学校网络上遇到一个问题,即 localhost 没有转换为 127.0.0.1。您可以尝试在 127.0.0.1 而不是 localhost 中进行硬编码。我不是网络专业人士,但值得一试。还要确保在您的客户端之前启动您的服务器,因为最有可能导致错误的罪魁祸首是循环之前的套接字和流。
  • 嗨,我确实先运行了服务器,然后运行了客户端。一切正常,服务器能够连接到服务器。只是我无法进入 encryptclient 的循环。那是代码挂的地方
  • 使用文本协议时,请务必使用 println() 或始终打印明确的“\n”。

标签: java server client


【解决方案1】:

据我了解,您正在尝试向服务器发送消息,执行一些逻辑,然后将其发送回客户端。上面的代码似乎在我这边运行良好。这是我所做的:

  • 首先运行EncryptServer。我希望这是您面临的问题。或者你的防火墙不允许你监听套接字。
  • EncryptServerSession 中,您正在阅读行但没有写行。 close 流或完成后写一个新行。

    ...
    
    out.write(message);
    out.write("\r\n"); // write new line
    out.flush();
    
    ...
    
    } finally {
        try {
          out.close();
        } catch (IOException e) {
        }
    }
    

    ...
    
    out.write(message);
    out.write("\r\n"); // write new line
    out.flush();
    
    ...
    

【讨论】:

  • 嗨,是的,它对我来说也运行良好。服务器和客户端都在工作。我只是无法进入加密客户端的循环,不知道为什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 2015-12-25
  • 2018-01-30
  • 1970-01-01
相关资源
最近更新 更多