我有一个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)是信息处理系