当前位置: 首页 > 面试题库 >

您可以同时写入套接字的输入和输出流吗?

丁成弘
2023-03-14
问题内容

我有一个Java应用程序,即Voip。我正在使用一个套接字通过线程同时发送和接收信息。代码如下所示。

Socket clientSocket = sockList.accept();
OutputStream outSock = clientSocket.getOutputStream();
InputStream inSock = clientSocket.getInputStream();
new Thread( new Capture(outSock)).start();
new Thread( new PlayAudio(inSock)).start();
outSock.close();
clientSocket.close();

我发现的问题是,当我写入输出流时,它在第一次写入时阻塞。我发送的字节数不多。贝娄是我的写代码。

private class Capture implements Runnable{

    private OutputStream out;
    public Capture(OutputStream out){
        this.out = out;
    }
    @Override
    public void run() {
        try{
            int numBytesRead;
            TargetDataLine outLine = getMic();
            outLine.open();
            outLine.start();

            byte[] data = new byte[outLine.getBufferSize() / 5];
            byte[] test = {0x1,0x1,0x1};

            while(true) {       
                //numBytesRead =  outLine.read(data, 0, data.length);
                //System.out.println(numBytesRead);
                out.write(test, 0, test.length);
                out.flush();
                /*if(numBytesRead > 0){
                    out.write(data, 0, data.length);
                    System.out.println("C");
                }*/
            }
        }catch(Exception ex){}
    }
}

读取声音代码的另一个线程是…

private class PlayAudio implements Runnable{

    private InputStream in;
    public PlayAudio(InputStream in){
        this.in = in;
    }
    @Override
    public void run() {
        int write;
        try{
        SourceDataLine inLine = getSpeaker();
        inLine.open();
        inLine.start();
        byte[] data = new byte[inLine.getBufferSize()];
        byte[] test = new byte[3];
        while(true){
            System.out.println(1);
            //write = in.read(data, 0, data.length);
            in.read(test, 0 , test.length);
            System.out.println(2);
            /*if(write > 0){
                inLine.write(data, 0, write);
                System.out.println(3);
                System.out.println(write);
            }*/
        }
        } catch(Exception ex){}
    }

}

我已经在实际代码中注释了很大一部分,因为我只是想使其正常工作。我的写函数在第一次写时无限期阻塞。这可能是我的线程有问题吗?我唯一的想法是输出和输入流共享我的套接字对象,这可能会导致死锁或其他原因。请让我知道最新情况。


问题答案:

是的,您可以同时写入套接字的输入和输出流。

从do-java-sockets-support-full-
duplex

由于输入流和输出流是Socket中的单独对象,因此您可能要担心的唯一问题是,如果有两个线程试图同时读取或写入(两个线程,相同的输入/输出流),该怎么办?时间?InputStream
/ OutputStream类的读/写方法不同步。但是,如果使用的是InputStream /
OutputStream的子类,则可能会同步正在调用的读取/写入方法。您可以检查javadoc中是否有要调用的类/方法,并很快找到它。



 类似资料:
  • 您好,我正在学习服务器-客户端应用程序的示例,我不明白客户端如何从服务器接收字符串。 服务器运行执行以下操作的线程: 在客户端类中有以下代码: 和和在线程和客户端类中以相同的方式实现,包括: 其中,也是同一个对象,它是客户机的socket 我的问题是为什么字符串正是字符串?服务器在输出流中写入,客户端从输入流中拾取,这不是两个不同的内存区域吗?

  • Netty TCP Server在端口处运行,接收格式的数据。它使用Marine API库将胡言乱语转换为需要从套接字输入流的有意义的信息。 如何获得正在使用的netty服务器端口的输入流?

  • 先说明我的问题。我已经在这里张贴了另一个类似的问题:PrintStream不能正确打印unicode字符(UTF-16 ),但不知何故我没有设法克服这个问题。 我想从android打印到网络打印机(施乐WC 24 PCL或者爱普生XP-600)。< br >假设: 我有以下文字: 然后我用“ISO-8859-7”、“Windows-1253”(希腊字符)调用以下代码: 但是打印机的结果(在ecli

  • 我有几个输出侦听器正在实现。它可以是写到stdout或文件的,也可以是写到内存或任何其他输出目标;因此,我在方法中指定作为(an)参数。 现在,我收到了。在这里向流写入的最佳方式是什么? 我应该只使用吗?我可以给它字节,但如果目标流是字符流,那么它会自动转换吗? 我需要用这里的一些桥流来代替吗?

  • 问题内容: 我有几个正在实现OutputStream的输出侦听器。它可以是写到stdout或文件的PrintStream,也可以写到内存或任何其他输出目标。因此,我在方法中将OutputStream指定为参数。 现在,我已经收到了字符串。在此处写入流的最佳方法是什么? 我应该只使用Writer.write(message.getBytes())吗?我可以给它提供字节,但是如果目标流是字符流,那么它

  • 本小节将会介绍基本输入输出的 Java 标准类,通过本小节的学习,你将了解到什么是输入和输入,什么是流;输入输出流的应用场景,File类的使用,什么是文件,Java 提供的输入输出流相关 API 等内容。 1. 什么是输入和输出(I / O) 1.1 基本概念 输入/输出这个概念,对于计算机相关专业的同学并不陌生,在计算中,输入/输出(Input / Output,缩写为 I / O)是信息处理系