我正在编写一个客户端服务器应用程序,我想从两个不同的线程(一个用于读取的线程,一个用于写入的线程)在一个套接字上读写。我的系统几乎可以正常工作,但是有一个令人困惑的错误,我似乎无法解决。阅读和写作相互独立的工作完美,但是当我开始从阅读Socket的OutputStream一个线程,写所有来电来InputStream在不同的线程块下去。
我编写了一个小型测试程序,用于快速重现该问题并消除尽可能多的外部变量。我使用java.nio的ServerSocketChannel和SocketChannel来建立连接,而我使用java.io的Socket(一个的基础套接字SocketChannel)则易于与ObjectInputStreamand 结合使用ObjectOutputStream。测试程序设计为运行两次;对于第一次运行,用户输入s以启动服务器,而在第二次运行中,用户输入c以运行客户端。
我的问题是:为什么objectOutput.writeObject( message );在该server()方法的第二次调用时执行以下程序块?(该方法的第四到最后一行)
我已经在程序代码下面列出了预期的输出和实际的输出以及我认为它们的含义。
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Scanner;
public class Main {
private static final String IP_ADDRESS = "localhost";
private static final int WELL_KNOWN_PORT = 4000;
public static …Run Code Online (Sandbox Code Playgroud) 例子:
$ foo="text with 'single quotes'"
$ echo $foo
Run Code Online (Sandbox Code Playgroud)
给我
text with 'single quotes'
Run Code Online (Sandbox Code Playgroud)
这是我想要的输出,但我想传递$foo具有相同结果的标准输入。类似于以下之一:
$ xargs echo <<< $foo
$ echo $foo | xargs echo
Run Code Online (Sandbox Code Playgroud)
这两个都给我
text with single quotes
Run Code Online (Sandbox Code Playgroud)
有没有办法保留单引号而不控制 foo 的内容?
我正在寻找一种无论命令如何都有效的解决方案,我选择它是xargs echo因为我认为它简单地显示了行为。该解决方案可能不存在,但如果有人有任何提示,将不胜感激!