Java 服务器和客户端之间的简单连接。客户端发送消息,服务器正确获取消息。但是当服务器试图回复时,什么都不起作用?

Java 服务器和客户端之间的简单连接。客户端发送消息,服务器正确获取消息。但是当服务器试图回复时,什么都不起作用?,java,multithreading,networking,connection,Java,Multithreading,Networking,Connection,如果分开 客户端---向---->服务器发送消息:工作正常 如果分开 服务器---向---->客户端发送消息:工作正常 但当两者结合在一起时: 客户端---将消息发送到--->服务器 服务器---将消息发送到---> 客户 没用 以下是服务器端: import java.io.*; import java.net.*; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar

如果分开

客户端---向---->服务器发送消息:工作正常

如果分开

服务器---向---->客户端发送消息:工作正常

但当两者结合在一起时:

客户端---将消息发送到--->服务器
服务器---将消息发送到---> 客户

没用

以下是服务器端:

import java.io.*;
import java.net.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class MyServer
{  
    private final static int port = 8000; 
    private static String hostname = "";
    private static String hostIP ="";
    public static void main(String[] args )
    {  
        ServerSocket serverSocket=null;
        try {
            // get host information
            hostname = InetAddress.getLocalHost().getHostName();
            hostIP = InetAddress.getLocalHost().getHostAddress();
            // display server information
            System.out.println("MyServer started on "+hostname+" with IP: "+hostIP + " on the port number: " + port);
            serverSocket = new ServerSocket(port);
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
        while(true)
        {   
            ClientWorker w;
            try
            {   
                w = new ClientWorker(serverSocket.accept());
                Thread t = new Thread(w);
                t.start();
            }
            catch(IOException e)
            {
                e.printStackTrace();
                break;
            }   
        }
    }
}   
class ClientWorker implements Runnable
{
    Socket incoming;
    public ClientWorker(Socket incoming)
    {
        this.incoming = incoming;
    }
    public void run()
    {
        String request = null;
        BufferedReader in = null;
        try {
            in = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            request = in.readLine();
            System.out.println("request =" + request);
        } catch (IOException e) {
            e.printStackTrace();
        }
        PrintWriter out = null;
        try {
            out = new PrintWriter(incoming.getOutputStream(),true);
        } catch (IOException e) {
            e.printStackTrace();
        }
        out.println("The command is not readable");

    }
}

以下是客户端:

import java.io.*;
import java.net.*;
public class MyClient2
{
    public static void main(String[] args)
    {
        String answer = null;
        if (args.length != 1){
            System.out.println("Usage: MyClient serverHostname");
            System.exit(0);
        }
        try
        {
            Socket socket = new Socket (args[0], 8000);
            PrintWriter out = new PrintWriter(socket.getOutputStream(),true);
            out.print("TIME");
            System.out.println("Request has been send");
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
            answer = in.readLine();         
            System.out.println("The answer is:  "+answer);
            in.close();
            out.close();
            socket.close();
        }
        catch (Exception e)
        {
            System.out.println("Make sure the server is running and try again");
        }
    }
}
请看一看,我感谢你的评论。
干杯

您使用的是
readLine
方法,该方法会一直阻塞,直到读取换行符或关闭流为止。您既不发送换行符也不关闭流(直到预期收到响应之后)

尝试更改
out.print(“时间”)
输出打印项次(“时间”)

另外,避免使用PrintWriter,因为它会隐藏发生的任何IOException,您必须手动检查。你的异常处理不是很好。当IOException发生时,您可能应该终止线程(而不是盲目地继续),因为您无法从错误中恢复


此外,您的
ClientWorker
本身不会进行清理,即关闭流和套接字。

您使用的是
readLine
方法,该方法会一直阻塞,直到读取换行符或关闭流为止。您既不发送换行符也不关闭流(直到预期收到响应之后)

尝试更改
out.print(“时间”)
输出打印项次(“时间”)

另外,避免使用PrintWriter,因为它会隐藏发生的任何IOException,您必须手动检查。你的异常处理不是很好。当IOException发生时,您可能应该终止线程(而不是盲目地继续),因为您无法从错误中恢复


此外,您的
ClientWorker
本身不会进行清理,即关闭流和套接字。

无错误无异常。该消息不会发送到服务器!当出现一些错误时,你可以去修复它,或者至少你知道你必须从哪里开始,但这种情况令人毛骨悚然!没有错误,也没有例外。该消息不会发送到服务器!当出现一些错误时,你可以去修复它,或者至少你知道你必须从哪里开始,但这种情况令人毛骨悚然!谢谢你的回复。问题解决了。除了PrintWriter之外,还有什么其他选项?一般做法是使用
OutputStreamWriter
,由
BufferedWriter
包装(与您的阅读器相同)。但是,
BufferedWriter
将缓冲您写入其中的任何数据,并且只有在您调用flush或其缓冲区已满时才实际发送数据(出于效率原因,它会这样做)。不过,由于您只编写了一小部分数据,因此只需使用
OutputStreamWriter
,您就可以顺利完成。谢谢您的回复。问题解决了。除了PrintWriter之外,还有什么其他选项?一般做法是使用
OutputStreamWriter
,由
BufferedWriter
包装(与您的阅读器相同)。但是,
BufferedWriter
将缓冲您写入其中的任何数据,并且只有在您调用flush或其缓冲区已满时才实际发送数据(出于效率原因,它会这样做)。不过,由于您只编写了一小部分数据,因此只需使用
OutputStreamWriter
,您就可以摆脱这种情况。