1.语音采集:客户端程序,调用音频驱动,实时采集”麦克风(mic)”的语音数据,保存到内存中。
2. 语音传输:将内存中语音数据,通过TCP/IP协议传输到服务器端。
3. 语音播放:服务器接收音频数据,并实时播放。
4. 设计可操作图形界面
5. 作为可选的扩充功能1,实现端与端之间的双向通信。
ps:服务端界面显示了本地的IP地址。
客户端和服务的都有保存音频文件输入框
1。服务端代码:
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
/*
* 双向通信的服务端.
*/
public class Server extends JFrame implements ActionListener {
private static String path;//接收文件的路径
private static String savepath;//保存文件的路径
JPanel jp1, jp2, jp3,jp4;
JLabel jl1 = null;
JButton captureBtn, stopBtn, playBtn, saveBtn,sendBtn,setButton;
//连接信息和录音信息
JLabel linkLabel=null;
JLabel rdLabel=null;
JLabel ipLabel=null;
//路径信息
JTextField repath,svpath;
//定义初始音频类
audioUtils server=null;
//获取本地IP
InetAddress ia=null;
Socket s=null;
// 构造函数
public Server() throws UnknownHostException {
// 组件初始化
jp1 = new JPanel();
jp2 = new JPanel();
jp3 = new JPanel();
jp4=new JPanel();
//文本框初始化
repath=new JTextField("输入接收录音文件保存的路径");
svpath=new JTextField("输入要保存的录音文件路径");
//定义连接和录音提示
linkLabel=new JLabel("未连接");
rdLabel=new JLabel("");
ipLabel=new JLabel("本地IP:"+ia.getLocalHost().getHostAddress());
// 定义字体
Font myFont = new Font("宋体", Font.BOLD, 30);
jl1 = new JLabel("实时通信系统服务端");
jl1.setFont(myFont);
captureBtn = new JButton("开始录音");
// 对开始录音按钮进行注册监听
captureBtn.addActionListener(this);
captureBtn.setActionCommand("captureBtn");
// 对停止录音进行注册监听
stopBtn = new JButton("停止录音");
stopBtn.addActionListener(this);
stopBtn.setActionCommand("stopBtn");
// 对播放录音进行注册监听
playBtn = new JButton("播放录音");
playBtn.addActionListener(this);
playBtn.setActionCommand("playBtn");
// 对保存录音进行注册监听
saveBtn = new JButton("保存录音");
saveBtn.addActionListener(this);
saveBtn.setActionCommand("saveBtn");
//对发送录音进行注册监听
sendBtn=new JButton("发送录音");
sendBtn.addActionListener(this);
sendBtn.setActionCommand("sendBtn");
//对设置ip,路径等监听
setButton=new JButton("保存设置");
setButton.addActionListener(this);
setButton.setActionCommand("setButton");
this.add(jp1, BorderLayout.NORTH);
this.add(jp2, BorderLayout.CENTER);
this.add(jp3, BorderLayout.SOUTH);
this.add(jp4,BorderLayout.NORTH);
jp3.setLayout(null);
jp3.setLayout(new GridLayout(1, 4, 10, 10));
jp2.add(rdLabel);
jp2.add(linkLabel);
jp2.add(ipLabel);
jp3.add(captureBtn);
jp3.add(stopBtn);
jp3.add(playBtn);
jp3.add(saveBtn);
jp3.add(sendBtn);
jp4.add(svpath);
jp4.add(repath);
jp4.add(setButton);
// 设置按钮的属性
this.captureBtn.setEnabled(false);
this.stopBtn.setEnabled(false);
this.playBtn.setEnabled(false);
this.saveBtn.setEnabled(false);
this.sendBtn.setEnabled(false);
// 设置窗口的属性
this.setSize(700, 500);
this.setTitle("服务端");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setVisible(true);
try {
server=new audioUtils();
//等待连接
ServerSocket ss=new ServerSocket(8888);
//阻塞方法,一直等待客户端接入
while(true){
//监听连接
s=ss.accept();
JOptionPane.showMessageDialog(null, "连接成功....");
System.out.println("已经连接");
linkLabel.setText("已连接:");
//开启一个接收文件的线程
server.recied(s, new File(path));
}
}
catch (Exception e) {
e.printStackTrace();
linkLabel.setText("未连接:");
}
}
//事件
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("captureBtn")) {
// 点击开始录音按钮后的动作
// 停止按钮可以启动
captureBtn.setEnabled(false);
stopBtn.setEnabled(true);
playBtn.setEnabled(false);
saveBtn.setEnabled(false);
sendBtn.setEnabled(false);
// 调用录音的方法
capture();
rdLabel.setText("正在录音..");
} else if (e.getActionCommand().equals("stopBtn")) {
// 点击停止录音按钮的动作
captureBtn.setEnabled(true);
stopBtn.setEnabled(false);