首页 > 代码库 > java语音聊天
java语音聊天
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */package n.audio.chart;import java.io.IOException;import java.net.DatagramPacket;import java.net.InetAddress;import java.net.MulticastSocket;/** * @author chch87 发送UDP报文的基类,扩展出MessageSender和SoundSender */public class UDPSender { protected MulticastSocket s; protected InetAddress group; protected int port; protected DatagramPacket dgp; public UDPSender(String groupAddress, int port) { this.port = port; try { s = new MulticastSocket(); group = InetAddress.getByName(groupAddress);//group一定要是个组播组!如231.0.0.1 } catch (IOException e) { e.printStackTrace(); } dgp = new DatagramPacket(new byte[0], 0, group, port); } public void close() { if (s != null) { s.close(); } } protected void send(byte[] buffer) { dgp.setData(buffer); dgp.setLength(buffer.length); try { s.send(dgp); } catch (IOException e) { e.printStackTrace(); } }}
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */package n.audio.chart;import java.io.IOException;import java.net.DatagramPacket;import java.net.InetAddress;import java.net.MulticastSocket;/** * @author chch87 接受UDP报文的基类,扩展出MessageReceiver和SoundReceiver */public class UDPReceiver { protected MulticastSocket s; protected InetAddress group; protected byte[] buffer; protected DatagramPacket dgp; protected int port; protected int bufferSize; protected boolean isClose; public UDPReceiver(String groupAddress, int port, int bufferSize) { try { s = new MulticastSocket(port); group = InetAddress.getByName(groupAddress);//group一定要是个组播组!如231.0.0.1 s.joinGroup(group); //s.setLoopbackMode(true);//在局域网测试时,可以将禁止回调打开 } catch (IOException e) { e.printStackTrace(); } buffer = new byte[bufferSize]; dgp = new DatagramPacket(buffer, bufferSize); isClose = false; this.port = port; this.bufferSize = bufferSize; } public void close() { if (s != null && group != null) { try { s.leaveGroup(group); s.close(); } catch (IOException e) { e.printStackTrace(); } isClose = true; } } public void contect() { if (isClose) { try { s = new MulticastSocket(port); s.joinGroup(group); } catch (IOException e) { e.printStackTrace(); } buffer = new byte[bufferSize]; dgp = new DatagramPacket(buffer, bufferSize); isClose = false; } } protected byte[] receive() { try { s.receive(dgp); } catch (IOException e) { e.printStackTrace(); } return buffer; } protected int getDgpLength() { return dgp.getLength(); } protected String getIP() { return dgp.getAddress().toString(); }}
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */package n.audio.chart;import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioSystem;import javax.sound.sampled.DataLine;import javax.sound.sampled.LineUnavailableException;import javax.sound.sampled.TargetDataLine;/** * @author Hello 放音部分 */public class SoundSender extends UDPSender implements Runnable { private TargetDataLine line; private final int bufferLength; private Thread thread; private boolean isStart; public SoundSender(String groupAddress, int port, int bufferLength) { super(groupAddress, port); AudioFormat format = new AudioFormat(8000, 16, 2, true, true); DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); try { line = (TargetDataLine) AudioSystem.getLine(info); line.open(format, line.getBufferSize()); } catch (LineUnavailableException e) { e.printStackTrace(); } this.bufferLength = bufferLength; isStart = false; } @Override public void run() { byte[] buffer = new byte[bufferLength]; while (isStart && !thread.isInterrupted()) { line.read(buffer, 0, buffer.length);//接受麦的数据写入buffer send(buffer); } } public void start() { if (thread == null || !thread.isAlive()) { thread = new Thread(this); line.start(); thread.start(); isStart = true; } } public void stop() { thread.interrupt(); line.stop(); isStart = false; }}
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */package n.audio.chart;import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioSystem;import javax.sound.sampled.DataLine;import javax.sound.sampled.LineUnavailableException;import javax.sound.sampled.SourceDataLine;public class SoundReceiver extends UDPReceiver implements Runnable { private SourceDataLine line; private Thread thread; private boolean isStart; public SoundReceiver(String groupAddress, int port, int bufferSize) { super(groupAddress, port, bufferSize); AudioFormat format = new AudioFormat(8000, 16, 2, true, true); DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); try { line = (SourceDataLine) AudioSystem.getLine(info); line.open(format, 10240); } catch (LineUnavailableException e) { e.printStackTrace(); } } public void run() { while (isStart && !thread.isInterrupted()) { byte[] data = http://www.mamicode.com/super.receive(); line.write(data, 0, data.length);//将data的数据转化为音频 } } public void start() { if (thread == null || !thread.isAlive()) { thread = new Thread(this); line.start(); isStart = true; contect(); thread.start(); } } public void stop() { thread.interrupt(); line.stop(); isStart = false; close(); }}
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */package n.audio.chart;import javax.swing.JTextArea;/** * @author Hello 把那几个sender、receiver又包装了一下,供GUI调用 */public class Chat { public static void main(String[] args) { Chat c = new Chat(null); c.soundStart(); } //private MessageReceiver massageReceiver; //private MessageSender massageSender; private final SoundReceiver soundReceiver; private final SoundSender soundSender; public Chat(JTextArea textArea) { //massageSender = new MessageSender("231.0.0.1",10000,textArea); //massageReceiver = new MessageReceiver("231.0.0.1",10000,1024,textArea); soundSender = new SoundSender("231.0.0.1", 10001, 1024); soundReceiver = new SoundReceiver("231.0.0.1", 10001, 1024); //massageReceiver.start(); } public void send(String message) { //massageSender.send(message); } public void soundStart() { soundReceiver.start(); soundSender.start(); } public void soundStop() { soundReceiver.stop(); soundSender.stop(); }}
java语音聊天
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。