Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多线程服务器中的线程连接_Java_Multithreading_Sockets_Arraylist_Client - Fatal编程技术网

Java 多线程服务器中的线程连接

Java 多线程服务器中的线程连接,java,multithreading,sockets,arraylist,client,Java,Multithreading,Sockets,Arraylist,Client,我正在用一个多线程服务器实现一个客户机-服务器程序,该服务器有一个ArrayList,各种客户机向其中发送数据,并将其添加到ArrayList中 客户: package p2pclient; import java.io.*; import java.net.*; import java.util.ArrayList; import java.util.Scanner; public class client { public static void main(String[] ar

我正在用一个多线程服务器实现一个客户机-服务器程序,该服务器有一个ArrayList,各种客户机向其中发送数据,并将其添加到ArrayList中

客户:

package p2pclient;

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

public class client {
    public static void main(String[] args) {
        Socket smtpSocket = null;  
        DataOutputStream os = null;
        DataInputStream is = null;
        Scanner s = new Scanner(System.in);

        try {
            smtpSocket = new Socket("localhost", 8888);
            os = new DataOutputStream(smtpSocket.getOutputStream());
            is = new DataInputStream(smtpSocket.getInputStream());
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: hostname");
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection to: hostname");
        }

        if (smtpSocket != null && os != null && is != null) {
            try {
                while(true)
                {
                    os.flush();
                    System.out.println("enter line");
                    String a = s.nextLine();
                    os.writeBytes(a + "\n");

                    System.out.println("wrote bytes");
                    String responseLine;

                    responseLine = is.readLine();
                    System.out.println("Server: " + responseLine);
                    if (responseLine.indexOf("Ok") != -1) {
                        System.out.println("breaking");
                        break;
                    }
                }
                os.close();
                is.close();
                smtpSocket.close();  
            } catch (UnknownHostException e) {
                System.err.println("Trying to connect to unknown host: " + e);
            } catch (IOException e) {
                System.err.println("IOException:  " + e);
            }
        }
        System.out.println("out of while");
    }           
}

服务器线程:

package server;

import java.io.*;
import java.net.*;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

public class ServerThread {

    public static void main(String args[]) throws InterruptedException {
        ServerSocket echoServer = null;
        Scanner s = new Scanner(System.in);
        String line;
        ArrayList<String> add_list = new ArrayList<String>();
        Collections.synchronizedList(add_list);
        int number=0;
        DataInputStream is;
        PrintStream os;
        Socket clientSocket = null;
        try {
            echoServer = new ServerSocket(8888);
        }
        catch (IOException e) {
            System.out.println(e);
        }   

        List<Thread> threads = new ArrayList<Thread>();
        while(true) {
            try {
                clientSocket = echoServer.accept();

                /* start a new thread to handle this client */
                number++;

                Thread t = new Thread(new ClientConn(clientSocket,number,add_list));
                t.start();
                threads.add(t);

            }catch (IOException e) {
                System.err.println("Accept failed.");
                System.err.println(e);
                System.exit(1);
            } 
            for (Thread t2 : threads)
            {
                t2.join();
            }
            System.out.println(add_list);
        }      
    }
}
包服务器;
导入java.io.*;
导入java.net。*;
导入java.util.*;
导入java.util.concurrent.CopyOnWriteArrayList;
公共类服务器线程{
公共静态void main(字符串args[])引发InterruptedException{
ServerSocket echoServer=null;
扫描仪s=新的扫描仪(System.in);
弦线;
ArrayList add_list=新建ArrayList();
集合.同步列表(添加列表);
整数=0;
数据输入流为;
打印流操作系统;
套接字clientSocket=null;
试一试{
echoServer=新服务器套接字(8888);
}
捕获(IOE异常){
系统输出打印ln(e);
}   
List threads=new ArrayList();
while(true){
试一试{
clientSocket=echoServer.accept();
/*启动一个新线程来处理此客户端*/
数字++;
线程t=新线程(新客户端连接(客户端套接字、编号、添加列表));
t、 start();
添加(t);
}捕获(IOE异常){
System.err.println(“接受失败”);
系统错误println(e);
系统出口(1);
} 
用于(螺纹t2:螺纹)
{
t2.连接();
}
System.out.println(添加列表);
}      
}
}

服务器可运行进程:

 package server;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.ArrayList;

class ClientConn implements Runnable {

    Socket client;
    DataInputStream in;
    DataOutputStream out;
    int s;
    ArrayList<String> al = new ArrayList<String>();

    ClientConn(Socket client,int s, ArrayList<String> al){
        this.client = client;
        this.s = s;
        this.al = al;

        try {
            in = new DataInputStream(client.getInputStream());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            out = new DataOutputStream(client.getOutputStream());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @SuppressWarnings("deprecation")
    @Override
    public void run() {
        // TODO Auto-generated method stub
        String response = "";

        try { 
            while (true) {
            response = "";
            response = in.readLine();
            out.writeBytes(response+"\n");
            if (response.indexOf("Ok") == -1)
                al.add(response);
            //  System.out.println(response);
            out.flush();
            if (response.indexOf("Ok") != -1) {
                //System.out.println("breaking");
                break;
            }
        }   
        } catch (IOException e) {
            System.err.println(e);
        }
    }
}
包服务器;
导入java.io.DataInputStream;
导入java.io.DataOutputStream;
导入java.io.IOException;
导入java.net.Socket;
导入java.util.ArrayList;
类ClientConn实现Runnable{
套接字客户端;
数据输入流输入;
数据输出流输出;
int-s;
ArrayList al=新的ArrayList();
ClientConn(套接字客户端、int s、ArrayList al){
this.client=client;
这个.s=s;
this.al=al;
试一试{
in=新的DataInputStream(client.getInputStream());
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
试一试{
out=新的DataOutputStream(client.getOutputStream());
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
@抑制警告(“弃用”)
@凌驾
公开募捐{
//TODO自动生成的方法存根
字符串响应=”;
试试{
while(true){
答复=”;
response=in.readLine();
out.writeBytes(响应+“\n”);
if(response.indexOf(“Ok”)=-1)
al.add(回复);
//System.out.println(响应);
out.flush();
if(response.indexOf(“Ok”)!=-1){
//系统输出打印(“中断”);
打破
}
}   
}捕获(IOE异常){
系统错误println(e);
}
}
}
我试图将所有线程放在一个ArrayList中,并连接主线程上的每个线程。这是行不通的。相反,每个线程在第一个线程上等待


如何使主线程在打印数组列表之前等待其他线程结束?

尝试将
服务器
线程中的
循环更改为:

while(true) {
    try {
        clientSocket = echoServer.accept();
        number++;
        Thread t = new Thread(new ClientConn(clientSocket,number,add_list));
        t.start();
        t.join();
        threads.add(t);
    } catch (IOException e) {
            System.err.println("Accept failed.");
            System.err.println(e);
            System.exit(1);
    } 
    System.out.println(add_list);
}

我不明白-您在等待accept()并在客户端连接时创建clientserver线程,然后立即等待它完成吗?直到第一个客户机线程终止,您才能返回accept()。