Java 客户端/服务器应用程序
伙计们,有谁能告诉我我怎么了?下面是四个文件:客户端文件、主文件、服务器文件和主文件。尝试从服务器读取fromServer.readLine()后,客户端出现错误。Java 客户端/服务器应用程序,java,Java,伙计们,有谁能告诉我我怎么了?下面是四个文件:客户端文件、主文件、服务器文件和主文件。尝试从服务器读取fromServer.readLine()后,客户端出现错误。 错误:客户端软件中的错误导致连接中止:recv失败 package client; import java.io.*; import java.net.*; import java.util.Scanner; p
错误:客户端软件中的错误导致连接中止:recv失败
package client;
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class Client
{
private PrintWriter toServer;
private BufferedReader fromServer;
private Socket socket;
public Client( )throws IOException
{
socket = new Socket("127.0.0.1",3000);
}
public void openStreams() throws IOException
{
//
// InputStream is = socket.getInputStream();
// OutputStream os = socket.getOutputStream();
// fromServer = new BufferedReader(new InputStreamReader(is));
// toServer = new PrintWriter(os, true);
toServer = new PrintWriter(socket.getOutputStream(),true);
fromServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
public void closeStreams() throws IOException
{
fromServer.close();
toServer.close();
socket.close();
}
public void run()throws IOException
{
openStreams();
String msg = "";
Scanner scanner = new Scanner(System.in);
toServer.println("Hello from Client.");
// msg = scanner.nextLine();
while (msg != "exit")
{
System.out.println(">");
// msg = scanner.nextLine();
toServer.println("msg");
String tmp = fromServer.readLine();
System.out.println("Server said: " + tmp);
}
closeStreams();
}
}
package server;
import java.net.*;
import java.io.*;
public class Server
{
private ServerSocket serverSocket;
private Socket socket;
private PrintWriter toClient;
private BufferedReader fromClient;
public void run() throws IOException
{
System.out.println("Server is waiting for connections...");
while (true)
{
openStreams();
processClient();
closeStreams();
}
}
public void openStreams() throws IOException
{
serverSocket = new ServerSocket(3000);
socket = serverSocket.accept();
toClient = new PrintWriter(socket.getOutputStream(),true);
fromClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
public void closeStreams() throws IOException
{
fromClient.close();
toClient.close();
socket.close();
serverSocket.close();
}
public void processClient()throws IOException
{
System.out.println("Connection established.");
String msg = fromClient.readLine();
toClient.println("Client said " + msg);
}
}
package client;
import java.io.IOException;
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
try
{
Client client = new Client();
client.run();
}
catch(IOException e)
{
System.err.println("Error in Client " + e.getMessage());
}
}
}
package server;
import java.io.IOException;
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
Server server = new Server();
try
{
server.run();
}
catch(IOException e)
{
System.err.println("Error in Server " + e.getMessage());
}
}
}
你的服务器端全搞乱了。您需要另一个类,称之为Connection或ConnectedClient,它实现Runnable;将套接字作为构造函数参数;并为特定客户机执行所有服务器端I/O。目前,这些都与服务器类混淆了。您的服务器类所要做的就是创建一个ServerSocket,然后输入一个接受套接字并为其创建连接对象和启动线程的循环。服务器的run()方法中的套接字对象只是一个本地对象,关联的输入/输出流或读/写器属于连接类,而不是服务器类 这样,您就可以同时处理多个客户机,而不必让它们彼此为难 下一个问题是,当另一端关闭连接时,readLine()返回null。每次调用readLine()时,在执行任何其他处理之前,必须先测试此项
接下来,在使用套接字时,任何时候当您收到SocketException或IOException而不是SocketTimeoutException时,它都是死的-关闭它,忘记该客户端,如果它发生在服务器中,则退出线程。您的服务器端完全混乱。您需要另一个类,称之为Connection或ConnectedClient,它实现Runnable;将套接字作为构造函数参数;并为特定客户机执行所有服务器端I/O。目前,这些都与服务器类混淆了。您的服务器类所要做的就是创建一个ServerSocket,然后输入一个接受套接字并为其创建连接对象和启动线程的循环。服务器的run()方法中的套接字对象只是一个本地对象,关联的输入/输出流或读/写器属于连接类,而不是服务器类 这样,您就可以同时处理多个客户机,而不必让它们彼此为难 下一个问题是,当另一端关闭连接时,readLine()返回null。每次调用readLine()时,在执行任何其他处理之前,必须先测试此项
接下来,当您在使用套接字时收到SocketException或IOException而不是SocketTimeoutException时,它是死的-关闭它,忘记该客户端,如果它发生在服务器中,则退出线程。发布的代码在客户端无限循环中运行。 在猜测要取消注释的行(Client.java中的最后一行
scanner.nextLine()
)之后,我注意到以下问题:
msg!=“exit”
在Java中始终为true-使用String.equals()public void processClient()throws IOException
{
String msg = null;
do {
msg = fromClient.readLine();
toClient.println("Client said " + msg);
} while (!"exit".equals(msg));
}
正在工作的Client.run是:
public void run()throws IOException
{
openStreams();
String msg = "";
Scanner scanner = new Scanner(System.in);
while (!"exit".equals(msg))
{
System.out.print(">");
msg = scanner.nextLine();
toServer.println(msg);
String tmp = fromServer.readLine();
System.out.println("Server said: " + tmp);
}
closeStreams();
}
+评论:我集中精力纠正明显的错误。EJP的回答为您提供了如何改进代码的良好指导,包括处理同步连接、正确使用线程等。发布的代码在客户端以无限循环运行。 在猜测要取消注释的行(Client.java中的最后一行
scanner.nextLine()
)之后,我注意到以下问题:
msg!=“exit”
在Java中始终为true-使用String.equals()public void processClient()throws IOException
{
String msg = null;
do {
msg = fromClient.readLine();
toClient.println("Client said " + msg);
} while (!"exit".equals(msg));
}
正在工作的Client.run是:
public void run()throws IOException
{
openStreams();
String msg = "";
Scanner scanner = new Scanner(System.in);
while (!"exit".equals(msg))
{
System.out.print(">");
msg = scanner.nextLine();
toServer.println(msg);
String tmp = fromServer.readLine();
System.out.println("Server said: " + tmp);
}
closeStreams();
}
+评论:我集中精力纠正明显的错误。EJP的回答为您提供了如何改进代码的良好指导,包括处理同步连接、正确使用线程等。您是要告诉我们错误是什么,还是我们猜测呢?@skaffman抱歉,我忘了它。我已经更新了我原来的帖子。@EJP和Miklos感谢你们的回答。你们是要告诉我们错误是什么,还是我们猜对了?@skaffman我很抱歉我忘记了。我已经更新了我原来的帖子。@EJP和Miklos感谢你们的回答。