Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.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 - Fatal编程技术网

Java多线程套接字-如何按顺序发送响应

Java多线程套接字-如何按顺序发送响应,java,multithreading,sockets,Java,Multithreading,Sockets,很抱歉,我看到的问题描述太长了 我已经在下面记录了代码,并且我一直在尝试使用线程使它按顺序发送消息。我继续在客户端上按顺序获得以下控制台输出 回显客户端消息:你好:0 14210577 14210579 回显客户端消息:你好:1 14211379 14211379 回显客户端消息:你好:2 14212181 14212181 回显客户端消息:你好:3 14212981 14212982 回显客户端消息:您好:4 14213782 14213782 回显客户端消息:你好:5 14214582 14

很抱歉,我看到的问题描述太长了

我已经在下面记录了代码,并且我一直在尝试使用线程使它按顺序发送消息。我继续在客户端上按顺序获得以下控制台输出

回显客户端消息:你好:0 14210577 14210579

回显客户端消息:你好:1 14211379 14211379

回显客户端消息:你好:2 14212181 14212181

回显客户端消息:你好:3 14212981 14212982

回显客户端消息:您好:4 14213782 14213782

回显客户端消息:你好:5 14214582 14214583

回显客户端消息:您好:6 14215383 14215383

回显客户端消息:你好:7 14216184 14216184

回显客户端消息:您好:8 14216984 14216984

回显客户端消息:你好:9 14217785 14217785

我希望在客户机上实现的控制台输出如下所示(消息2之后的所有消息都在消息2之前发送)

回显客户端消息:你好:0 14210577 14210579

回显客户端消息:你好:1 14211379 14211379

回显客户端消息:你好:3 14212981 14212982

回显客户端消息:您好:4 14213782 14213782

回显客户端消息:你好:5 14214582 14214583

回显客户端消息:您好:6 14215383 14215383

回显客户端消息:你好:7 14216184 14216184

回显客户端消息:您好:8 14216984 14216984

回显客户端消息:你好:9 14217785 14217785

回显客户端消息:你好:2 14212181 14217885

客户端上的控制台输出具有以下内容:;我可以看到服务器对消息3的响应在消息2完成等待时间后才会发送。我希望服务器在消息2完成等待之前发送对消息3的响应

传入客户端消息:你好:2 15430652

正在服务器线程中调用发送消息:15430653

从ServerThread中的发送消息返回:15430653

在sendMessage.doWork()中:15430653

sendMessage.doWork()已完成等待:15430753

传入客户端消息:你好:3 15430753

如何使线程继续处理其他消息,而不必等待消息2完成等待

提前感谢您的任何意见

服务器类:

// Built off the following tutorials
// https://www.youtube.com/watch?v=2cQJJwoSNLk
// https://www.youtube.com/watch?v=nCIw0h1C8Qo

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.TimeUnit;

public class Server{
    
    public static void main(String[] args) {
        try {
            new Server().runServer();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void runServer() throws IOException{
        final int PORT = 4444;
        ServerSocket serverSocket = new ServerSocket(PORT);
        System.out.println(new StringBuilder().append("Server up and ready for connections...").toString());
        while(true){
            Socket socket = serverSocket.accept();
            new Thread(new ServerThread(socket)).start();
        }
    }
    
    public class ServerThread implements Runnable{
        
        private Socket socket;
        private String message;
        
        ServerThread(Socket socket){
            this.socket = socket;
        }
        
        public void run(){
            
            try {
                this.message = null;
                PrintWriter printWriter = new PrintWriter(socket.getOutputStream(),true);
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader (socket.getInputStream()));
                while((message = bufferedReader.readLine()) != null){
                    System.out.println(new StringBuilder().append("incoming client message: ").append(message).toString());
                    long sendTime = System.nanoTime();
                    if(message.trim().startsWith("Hello: 2")){
                        sendTime = System.nanoTime() + 100000000;
                    }
                    
                    System.out.println(new StringBuilder().append("calling Send Message in ServerThread: ").append(" ").append(TimeUnit.NANOSECONDS.toMillis(System.nanoTime())).toString());
                    
                    new Thread( 
                            new SendMessage(printWriter, 
                                            sendTime, 
                                            new StringBuilder().append("echoing client message: ").append(message).append(" ").append(TimeUnit.NANOSECONDS.toMillis(System.nanoTime())).toString()
                                            )
                            ).start();
                    
                    System.out.println(new StringBuilder().append("returned from Send Message in ServerThread: ").append(" ").append(TimeUnit.NANOSECONDS.toMillis(System.nanoTime())).toString());
                }
            } catch (IOException e) {
            }
            
        }

    }

}
客户端类:

// Built off the following tutorials

// https://www.youtube.com/watch?v=2cQJJwoSNLk

// https://www.youtube.com/watch?v=nCIw0h1C8Qo



import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.Socket;

import java.net.UnknownHostException;

import java.util.concurrent.TimeUnit;


public class Client {

public static final int PORT = 4444;

public static void main(String[] args) throws UnknownHostException, IOException {

    Socket socket = new Socket("localhost",PORT);
    PrintWriter printWriter = new PrintWriter(socket.getOutputStream(),true);
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    for(int x = 0; x<10;x++){
        if(x==5){
            printWriter.println(new StringBuilder().append("Hello: ").append(x).append(" ").append(TimeUnit.NANOSECONDS.toMillis(System.nanoTime())).toString());
        }else{
            printWriter.println(new StringBuilder().append("Hello: ").append(x).append(" ").append(TimeUnit.NANOSECONDS.toMillis(System.nanoTime())).toString());
        }
        System.out.println(new StringBuilder().append(bufferedReader.readLine()));
    }
    //socket.close();
}


}

总的来说,您的代码看起来不错。问题可能在于您创建和启动线程的方式:

  while(true){
        Socket socket = serverSocket.accept();
        new Thread(new ServerThread(socket)).start();
    }
看起来每个新线程在创建新线程之前都会很快完成其执行。要实现异步线程执行,请尝试创建几个
ServerThread
实例并同时启动所有实例:

  while(true){
        Socket socket = serverSocket.accept();
        List<Thread> threads = new ArrayList<>();
        for (int i = 0; i < 4; i++)
        {
            threads.add(new Thread(new ServerThread(socket)));
        }
        threads.forEach(Thread::start);
 }
while(true){
Socket=serverSocket.accept();
List threads=new ArrayList();
对于(int i=0;i<4;i++)
{
添加(新线程(新服务器线程(套接字));
}
forEach(线程::start);
}

所以。。。。你是说每个客户端消息都应该有自己的服务器线程吗?如果你想要一个特定的序列,为什么要使用线程?我不想要一个特定的序列,但我想模拟丢弃和延迟的数据包。。。丢弃的数据包很容易模拟。。。只是不要送他们。。。延迟的数据包似乎是一个需要模拟的问题。
  while(true){
        Socket socket = serverSocket.accept();
        List<Thread> threads = new ArrayList<>();
        for (int i = 0; i < 4; i++)
        {
            threads.add(new Thread(new ServerThread(socket)));
        }
        threads.forEach(Thread::start);
 }