我正在尝试使用java中的套接字编写客户端 - 服务器系统,但是我似乎无法读取从服务器发送到客户端的数据。
以下是客户端的代码:
public class ClientSocket
{
Socket clientSocket = null;
PrintWriter out = null;
BufferedReader in = null;
// establish a connection to All Care's server application through socket 4444 (adjust localhost to reflect the IP address that the server
// is being run from)
public ClientSocket()
{
try
{
clientSocket = new Socket("localhost", 4445);
out = new PrintWriter(clientSocket.getOutputStream());
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
}
catch (IOException e)
{
System.out.println("Could not connect to All Care Server Application");
}
}
public void closeClientSocket()
{
try
{
clientSocket.close();
}
catch (IOException e)
{
System.out.println("Could not close connection to All Care Server Application");
}
}
public String getMessageFromServer()
{
try
{
String input = in.readLine();
return input;
}
catch (IOException e)
{
System.out.println("Could not read message from server");
}
return "No Data";
}
public void sendMessageToServer(String message)
{
out.write(message);
}
}
这是服务器代码:
public class ArFileServer {
public static void main(String[] args)
{
ServerSocket serverSocket = null;
boolean listening = true;
try
{
serverSocket = new ServerSocket(4445);
// infinite loop to continually listen for connection requests made by clients
while (listening)
{
new ClientConnection(serverSocket.accept()).start();
if (serverSocket != null)
{
System.out.println("Connection to client established");
}
}
serverSocket.close();
}
catch (IOException e)
{
System.out.println("Error could not create socket connection to port");
}
}
}
public class ClientConnection extends Thread
{
private Socket socket = null;
public ClientConnection(Socket socket)
{
super("ClientConnection");
this.socket = socket;
}
// the thread that runs after a connection to the server has been accepted
@Override
public void run()
{
try
{
PrintWriter out = new PrintWriter(socket.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
sendMessagetoClient(out, "CONNECTION SUCCESS");
// check login credentials sent from client to the server
// if valid send back their encrypted password, otherwise output a login error message
// wait for user input and then do various processes based on their requests
in.close();
out.close();
socket.close();
}
catch (IOException e)
{
System.out.println("Client socket connection error");
}
}
// sends a message to the client
void sendMessagetoClient(PrintWriter out, String message)
{
out.write(message);
}
// listens for a message from the client
String getMessageFromClient(BufferedReader in)
{
try
{
String input = in.readLine();
return input;
}
catch (IOException e)
{
System.out.println("Could not read message from client");
}
return "No Data";
}
以下是用于查看数据是否正在发送的代码行。
System.out.println(clientSocket.getMessageFromServer());
答案 0 :(得分:2)
在sendMessageToClient()
方法中,您需要刷新:
void sendMessagetoClient(PrintWriter out, String message)
{
out.write(message);
out.flush();
}
或者,当您创建PrintWriter
时,请使用带autoflush
的构造函数:
PrintWriter out = new PrintWriter(socket.getOutputStream(),true);
当你写作时,而不是out.write(message)
使用printf()
或println()
。
答案 1 :(得分:0)
这里有几个问题。
你正在读行,但你不是在写行。
您没有检查readLine()的结果是否为null,这意味着对等方已关闭连接,这意味着您必须这样做。
写完后你没有冲洗PrintWriter
。
您正在以错误的顺序关闭事物。您必须关闭已连接到套接字的输出编写器/流。执行此操作会将其刷新,然后关闭输入流/读取器和套接字。以错误的顺序执行此操作会丢失刷新。关闭输出后,您不需要关闭其他两个。
您正在使用PrintWriter,
在网络中吞下异常,您需要了解通信中的异常和错误,并且您也没有检查错误。使用BufferedWriter.
答案 2 :(得分:-2)
。 用于客户端套接字连接
socket soc= new socket ("server host ip",port);