我有一个非常简单的大写Java程序。客户端将从标准输入读取的文本发送到服务器,后者将该文本转换为大写字母程序运行良好,但一旦客户端停止(使用NetBeans ide),服务器也会重置。无论客户端是否被停止,服务器套接字都应该继续监听来自客户端的新连接。
public class Client
{
public static void main(String[] args) throws IOException
{
try(Socket s=new Socket("localhost",9090))
{
while(true)
{
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
BufferedReader rd=new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedReader from=new BufferedReader(new InputStreamReader(System.in));
String read=from.readLine();
out.println(read);
String answer;
answer=rd.readLine();
System.out.println(answer);
}
}
}
}
public class Server
{
public static void main(String[] args) throws IOException
{
try(ServerSocket listener = new ServerSocket(9090);
Socket socket = listener.accept();)
{
while (true)
{
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
System.out.println("Started...");
String transform=br.readLine();
String newStr=transform.toUpperCase();
out.println(newStr);
}
}
}
}
答案 0 :(得分:0)
正常行为会发生什么。您的服务器代码仅包括处理单个客户端。 listener.accept()函数只接受与服务器的最新连接。您需要将listened.accept()放在循环中并处理其中引发的所有异常。服务器端代码应如下所示:
public class Server
{
public static void main(String[] args) throws IOException
{
try(ServerSocket listener = new ServerSocket(9090);
while (true) {
try {
Socket socket = listener.accept();)
…
} catch (SocketException ex) {
...
}
}
}
}
但请记住,此代码一次只能处理单个客户端。此代码中没有多线程。
答案 1 :(得分:-1)
您的Server
正在关闭连接然后完成,因为它是在while循环之外创建的。我相信这就是你所需要的。
public class Server {
public static void main (final String[] args)
throws IOException {
while (true) {
try (ServerSocket listener = new ServerSocket(9090); Socket socket = listener.accept();) {
while (true) {
final BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
final PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
System.out.println("Started...");
final String transform = br.readLine();
if (transform == null)
break;
final String newStr = transform.toUpperCase();
out.println(newStr);
}
}
}
}
}