【问题标题】:Java Client Server Chat application loses connectionJava 客户端服务器聊天应用程序失去连接
【发布时间】:2019-03-16 17:13:01
【问题描述】:

我最近用 java 编写了一个套接字通信程序,其中两个线程在每个服务器上并发运行,客户端处理对套接字的读取和写入操作,从而允许双方连续发送和接收消息。

问题是客户端或服务器停止接收来自另一端的通信,然后在一段时间后它们都停止工作。我不知道出了什么问题以及连接如何断开:/

服务器代码

  import java.net.*; 
  import java.io.*; 
  import java.util.Scanner; 

 public class Server 
{ 

private Socket          socket   = null;  
private ServerSocket    server   = null; 
private DataInputStream in       =  null; 
private DataOutputStream out       =  null;
private Scanner inp       =  null;
String line = "";
String iline = "";      

public Server(int port) 
{ 
    try
    { 
        server = new ServerSocket(port); 
        System.out.println("Server started"); 

        System.out.println("Waiting for a client ..."); 

        socket = server.accept(); 
        System.out.println("Client accepted"); 

        // takes input from the client socket   
        out=new DataOutputStream(socket.getOutputStream());         

        in = new DataInputStream(new 
  BufferedInputStream(socket.getInputStream()));
        inp = new Scanner(System.in);           



        while (true) 
        { 



                new Thread(new Runnable(){

                    public void run() 
                    {
                        try{
                        while(true){
                            line = in.readUTF(); 
                            System.out.println("Client : "+line);

  if(socket.isClosed()||socket.isOutputShutdown()||socket.isInputShutdown()) 
    {
                            System.out.println("DED");
                            System.exit(0);
                }

                        }
                        }
                        catch(Exception e){
                        System.out.println("Exception !!!");
                        }
                    }
                    }).start();
                        iline=inp.nextLine();
                        out.writeUTF(iline);

 if(socket.isClosed()||socket.isOutputShutdown()||socket.isInputShutdown()){
                    System.out.println("DED");
                    System.exit(0);
                }
        } 
    } 
    catch(IOException i) 
    { 
        System.out.println(i); 
    } 
} 

public static void main(String args[]) 
{ 
    Server server = new Server(5000); 
} 
} 

客户代码

      import java.net.*; 
      import java.io.*;
      import java.util.Scanner; 
      class Client{

private Socket socket =null;
private DataInputStream inp=null;
private DataOutputStream out=null;
private Scanner in=null;
String line="";
String iline="";
Client(String address,int port)
{
    try{

        socket = new Socket(address,port);
        in= new Scanner(System.in);
        out = new DataOutputStream(socket.getOutputStream());
        inp = new DataInputStream(new BufferedInputStream(socket.getInputStream()));

        while(true){

            line=in.nextLine();
            out.writeUTF(line);
            new Thread(new Runnable(){

                public void run() 
                {

                    try{
                    while(true){
                    iline=inp.readUTF();
                    System.out.println("Server : "+iline);
                    if(socket.isClosed()||socket.isOutputShutdown()||socket.isInputShutdown()){
                    System.out.println("DED");
                    System.exit(0);
                }                       
                    }
                    }
                    catch(Exception e){
                        System.out.println("Exception !!!");
                    }
                }

            }).start();
                    if(socket.isClosed()||socket.isOutputShutdown()||socket.isInputShutdown()){
                    System.out.println("DED");
                    System.exit(0);
                }
        }   

    }
    catch(UnknownHostException u) 
        { 
            System.out.println(u); 
        } 
    catch(Exception e){
        System.out.println("EXCEPTION!!!");
    }
}
 }


 class ClientSocket{

public static void main(String...args){
    Client obj = new Client("127.0.0.1", 5000);

   }

   }

【问题讨论】:

  • 只是我在第一个 while(true){} 中看到的代码的初始运行,您正在生成一个线程调用它的 start 方法。在您启动读取线程的那一刻,主线程检查套接字条件并继续前进。由于在您的第一个 while(true) 中有一个 true,因此会再次生成一个新线程,并且该线程会一直运行,直到套接字关闭,程序因 system.exit 调用而终止。
  • @MukeshVerma 感谢您提供的信息 =),我现在明白每次都会产生一个新线程,但我仍然不明白连接是如何关闭的,是否有任何解决方法我正面临着,我应该如何解决它。谢谢你:)
  • @MukeshVerma 我明白了。只是将线程放在while循环之外,它似乎工作正常。产生的新线程开始从套接字读取,主线程继续写入。再次感谢您的帮助^_^

标签: java multithreading sockets networking


【解决方案1】:

我在第一个 while(true){} 中看到的只是初步运行您的代码,您正在生成一个线程调用它的 start 方法。在您启动读取线程的那一刻,主线程检查套接字条件并继续前进。由于在您的第一个 while(true) 中存在一个 true,因此会再次生成一个新线程,并且该线程会一直运行,直到套接字关闭,程序因 system.exit 调用而终止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    相关资源
    最近更新 更多