ArrayList 显示与 Java Thread 一起显示



服务器代码:

public class server {
//private static ArrayList<user> t = new ArrayList<>();
public static  Socket s = null;
public static ServerSocket ss = null;
public static void main(String[] args) {
    try {
         ss = new ServerSocket(1777);
        while (true) {
            System.out.println("waiting for connexion");
             s = ss.accept();
           System.out.println("connected with "+s.getRemoteSocketAddress());
            InputStream is = s.getInputStream();
            OutputStream os = s.getOutputStream();
            InputStreamReader isr = new InputStreamReader(is);  
            BufferedReader br = new BufferedReader(isr);
            PrintWriter pw = new PrintWriter(os,true);
            String username = br.readLine();             
            int number = 0;
            user us = new user(s,number,username);
            //t.add(us);
            pw.print(us);
           //new service(s,username,number,t).start();
           new service(s,us).start();
            number++;
        }
    } catch (Exception e) {
        System.out.println(e.getMessage());                        
    }
} 
}

服务类代码 :

public class service extends Thread {
private static Socket s;
private static String user;
private  static int number ; 
private  ArrayList<user> locallist = new ArrayList<user>();
private static user us;
public service(Socket s,user u){
    this.s = s;
    this.us = u;
    locallist.add(u);
}
@Override
public void run() {
    int listsize = locallist.size();
     user lastuser = locallist.get(listsize-1);
    try {
        while (true) {
            InputStream is = s.getInputStream();
            OutputStream os = s.getOutputStream();
            InputStreamReader isr = new InputStreamReader(is);  
            BufferedReader br = new BufferedReader(isr);
            PrintWriter pw = new PrintWriter(os,true);
            System.out.println("last user : " + lastuser);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}    
}

客户端类代码:

public class client {
public static void main(String[] args) {
    try {
        while (true) {
        Socket s = new Socket("localhost",1777);
        System.out.println("connected with localhost");
        InputStream is = s.getInputStream();
        OutputStream os = s.getOutputStream();
        InputStreamReader isr = new InputStreamReader(is);  
        BufferedReader br = new BufferedReader(isr);
        PrintWriter pw = new PrintWriter(os,true);
        Scanner e = new Scanner(System.in);
        System.out.println("enter you username to continue");
        String username = e.next();
        pw.println(username);
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
}

服务器输出:

waiting for connexion
connected with /127.0.0.1:51899
waiting for connexion
connected with /127.0.0.1:51902
last user : username teste usernumber 0
last user : username teste usernumber 0
last user : username teste usernumber 0

基本上是无限循环

客户端输出:

connected with localhost
enter you username to continue
teste
connected with localhost
enter you username to continue

我的问题是我如何停止无限循环并在每个客户端连接后显示最后一个连接/添加的成员

在服务器类中:

public static void main(String[] args) {
    try {
        ss = new ServerSocket(1777);
        int number = 0; // <--- place the counter here not in the while
        while (true) {
            System.out.println("waiting for connexion");
            s = ss.accept();
            System.out.println("connected with "+s.getRemoteSocketAddress());
            InputStream is = s.getInputStream();
            OutputStream os = s.getOutputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            PrintWriter pw = new PrintWriter(os,true);
            String username = br.readLine();
            //int number = 0; // Not here ... you just set the counter always to 0
            user us = new user(s,number,username);
            pw.print(us);
            new service(s,us).start();
            number++;
        }
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}

在服务类中:

@Override
public void run() {
    int listsize = locallist.size();
    user lastuser = locallist.get(listsize-1);
    try {
        // while(true) { // <--- should be removed
        InputStream is = s.getInputStream();
        OutputStream os = s.getOutputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        PrintWriter pw = new PrintWriter(os,true);
        System.out.println("last user : " + lastuser);
        // } <--- while-end
        // <--- for later use?
    } catch (Exception e) {
        e.printStackTrace();
    }
}

所以这就是完成的代码...您只需删除服务类中的 while,将反变量"number"的声明移出服务器类中的 while。

如果您想稍后在服务类中使用while进行服务器和客户端之间的通信,您只需在打印用户后放置一段时间即可。

相关内容

最新更新