Java多线程套接字-如何按顺序发送响应
很抱歉,我看到的问题描述太长了 我已经在下面记录了代码,并且我一直在尝试使用线程使它按顺序发送消息。我继续在客户端上按顺序获得以下控制台输出 回显客户端消息:你好: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完成等待 提前感谢您的任何意见 服务器类: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
// 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);
}