【发布时间】:2017-04-18 17:18:50
【问题描述】:
我在做作业时偶然发现了一个死块。这是一个简单的服务器和客户端程序。 该方案的具体内容如下;
- 创建一个监听传入连接的服务器类
EncryptServer。如果有连接,接受它并创建一个线程EncryptServerSession来处理输入和输出流。 - 创建一个线程类
EncryptServerSession,从服务器类接收输入和输出流并进行处理。 - 创建一个客户端类
EncryptClient,它连接到服务器类并从EncryptServerSession到EncryptServer获取输出流。
不知何故,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”。