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
,您就可以摆脱这种情况。