文档章节

java语音聊天程序集成了java文本聊天和java语音聊天

q叉烧p
 q叉烧p
发布于 2015/12/01 00:57
字数 920
阅读 551
收藏 17
java语音聊天程序集成了java文本聊天和java语音聊天。

///服务器界面

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;

public class Server extends Frame
{
    TextField tf=new TextField(20);
    TextArea ta=new TextArea();
    Button send=new Button("send");
    Button voiceChat=new Button("voiceChat");
    ServerSocket serSocket;
    Socket client;
    InputStream in;
    BufferedReader br;
    OutputStream out;
    BufferedWriter bw;
    public Server()
    {
        super("Server");
        add("North",tf);
        add("Center",ta);
        add("South",send);
        add("East",voiceChat);
        setBackground(Color.yellow);
        setSize(250,250);
        show();
        addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                dispose();
                System.exit(0);
            }
        }
        );
        try
        {
            ServerSocket serSocket=new ServerSocket(5000);
            client=serSocket.accept();
            ta.append("client host"+client.getInetAddress().getHostName()+"\n\n");
            in=client.getInputStream();
            br=new BufferedReader(new InputStreamReader(in));
            out=client.getOutputStream();
            bw=new BufferedWriter(new OutputStreamWriter(out));
        }
        catch(Exception e)
        {
        }
        while(true)
        {
            try
            {
                byte[] buf=new byte[200];
                in.read(buf);
                String str=new String(buf);
                ta.append("Client say:"+str);
                ta.append("\n");
            }
            catch(IOException e)
            {
            }
        }
    }
    public boolean action(Event evt, Object arg)
    {
        if(evt.target.equals(send))
        {
            try
            {
                String str=tf.getText();
                byte[] buf=str.getBytes();
                tf.setText(null);
                out.write(buf);
                ta.append("I say:"+str);     ta.append("\n");
            }
            catch(IOException ioe)
            {
            }
        }
        else if(evt.target.equals(voiceChat))
        {
            try
            {
                ServerSocket serSock=new ServerSocket(6000);
                Socket cli=serSock.accept();
                Playback player=new Playback(cli);
                player.start();
            }
            catch(Exception e)
            {
            }
        }
        return true;
        
    }
    
    public static void main(String[] args)
    {
        Server server=new Server();
    }
}

//客户端界面

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
public class Client extends Frame
{
    TextField tf=new TextField(20);
    TextArea ta=new TextArea();
    Button send=new Button("send");
    Button voiceChat=new Button("voiceChat");
    Socket client;
    InputStream in;
    OutputStream out;
    BufferedReader br;
    BufferedWriter bw;
    public Client()
    {
        super("Client");
        add("North",tf);
        add("Center",ta);
        add("South",send);
        add("East",voiceChat);
        setSize(250,250);
        show();
        addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                dispose();
                System.exit(0);
            }
        });
        try
        {
            Socket client=new Socket("127.0.0.1",5000);
            ta.append("Connect to:"+client.getInetAddress().getHostName()+"\n\n");
            in=client.getInputStream();
            br=new BufferedReader(new InputStreamReader(in));
            out=client.getOutputStream();
            bw=new BufferedWriter(new OutputStreamWriter(out));
        }
        catch(IOException ioe)
        {}
        while(true)
        {
            try
            {
                byte[] buf=new byte[200];
                in.read(buf);
                String str=new String(buf);
                ta.append("Server say:"+str);
                ta.append("\n");
            }
            catch(IOException e)
            {
                System.out.print(e.getMessage());
            }
        }
    }
    public boolean action(Event evt, Object arg)
    {
        if(evt.target.equals(send))
        {
            try
            {
                String str=tf.getText();
                byte[] buf=str.getBytes();
                tf.setText(null);
                out.write(buf);
                ta.append("I say:"+str);
                ta.append("\n");
            }
            catch(IOException ioe)
            {
                System.out.print(ioe.getMessage());
            }
        }
        else if(evt.target.equals(voiceChat))
        {
            try
            {
                Socket cli=new Socket("127.0.0.1",6000);
                Capture cap=new Capture(cli);
                cap.start();
            }
            catch(Exception e)
            {}
        }
        return true;
    }
    public static void main(String[] args)
    {
        Client client=new Client();
    }
    
}

//音频捕获部分,
//Capture.java
import java.io.*; 
import javax.sound.sampled.*; 
import java.net.*;

/** 
* Title:        VoiceChat 
* Description: 音频捕捉(录音程序) 
* Copyright:    Copyright (c) 2001 
* Company: 
* @author        
* @version 1.0 
*/

class Capture implements Runnable {

       TargetDataLine line; 
       Thread thread; 
       Socket s; 
       BufferedOutputStream captrueOutputStream;

       Capture(Socket s){//构造器 取得socket以获得网络输出流 
         this.s=s; 
       }

       public void start() {

           thread = new Thread(this); 
           thread.setName("Capture"); 
           thread.start(); 
       }

       public void stop() { 
           thread = null; 
       }

       public void run() {

           try { 
             captrueOutputStream=new BufferedOutputStream(s.getOutputStream());//建立输出流 此处可以加套压缩流用来压缩数据 
           } 
           catch (IOException ex) { 
               return; 
           }

           AudioFormat format =new AudioFormat(8000,16,2,true,true);//AudioFormat(float sampleRate, int sampleSizeInBits, int channels, boolean signed, boolean bigEndian) 
           DataLine.Info info = new DataLine.Info(TargetDataLine.class,format);

           try { 
               line = (TargetDataLine) AudioSystem.getLine(info); 
               line.open(format, line.getBufferSize()); 
           } catch (Exception ex) { 
               return; 
           }

           byte[] data = new byte[1024];//此处的1024可以情况进行调整,应跟下面的1024应保持一致 
           int numBytesRead=0; 
           line.start();

           while (thread != null) { 
               numBytesRead = line.read(data, 0,128);//取数据(1024)的大小直接关系到传输的速度,一般越小越快, 
               try { 
                 captrueOutputStream.write(data, 0, numBytesRead);//写入网络流 
               } 
               catch (Exception ex) { 
                   break; 
               } 
           }

           line.stop(); 
           line.close(); 
           line = null;

           try { 
               captrueOutputStream.flush(); 
               captrueOutputStream.close(); 
           } catch (IOException ex) { 
               ex.printStackTrace(); 
           } 
       } 
     
}

//下面是音频输出的代码:

//Playback.java
import java.io.*; 
import javax.sound.sampled.*; 
import java.net.*;


/** 
* Title:        VoiceChat 
* Description: 输出音频(放音程序) 
* Copyright:    Copyright (c) 2001 
* Company: 
* @author        
* @version 1.0 
*/


class Playback implements Runnable {

       final int bufSize = 16384; 
       SourceDataLine line; 
       Thread thread; 
       Socket s;

       Playback(Socket s){//构造器 取得socket以获得网络输入流 
         this.s=s; 
       } 
       public void start() {

           thread = new Thread(this); 
           thread.setName("Playback"); 
           thread.start(); 
       }

       public void stop() { 
           thread = null; 
       }

       public void run() {

           AudioFormat format =new AudioFormat(8000,16,2,true,true);//AudioFormat(float sampleRate, int sampleSizeInBits, int channels, boolean signed, boolean bigEndian) 
           BufferedInputStream playbackInputStream;

           try { 
             playbackInputStream=new BufferedInputStream(new AudioInputStream(s.getInputStream(),format,2147483647));//封装成音频输出流,如果网络流是经过压缩的需在此加套解压流 
           } 
           catch (IOException ex) { 
               return; 
           }

           DataLine.Info info = new DataLine.Info(SourceDataLine.class,format);

           try { 
               line = (SourceDataLine) AudioSystem.getLine(info); 
               line.open(format, bufSize); 
           } catch (LineUnavailableException ex) { 
               return; 
           }

           byte[] data = new byte[1024];//此处数组的大小跟实时性关系不大,可根据情况进行调整 
           int numBytesRead = 0; 
           line.start();

           while (thread != null) { 
              try{ 
                 numBytesRead = playbackInputStream.read(data); 
                 line.write(data, 0,numBytesRead); 
              } catch (IOException e) { 
                   break; 
               } 
           }

           if (thread != null) { 
               line.drain(); 
           }

           line.stop(); 
           line.close(); 
           line = null; 
       } 
}


© 著作权归作者所有

下一篇: UUID
q叉烧p
粉丝 21
博文 76
码字总数 75416
作品 0
东莞
程序员
私信 提问
加载中

评论(1)

流刘
流刘
大哥,这个语音聊天程序我运行了一下,文字发送可以实现,但是语音连接我连接不上,没有声音。求大神指点!!!
Nextalk专业社区网站即时通讯系统,5.7版本正式发布。

NexTalk简单专业、开放源码的网站即时消息系统 NexTalk是专为网站设计的简单专业,开放源码的即时消息系统。可快速为社区网站、电子商务网站、企业网站提供即时消息服务。 NexTalk可为电子商...

lee8913151
2014/10/16
9
0
Java实现QQ微信轰炸机1.0(乞丐版)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/xiaoxiaob/article/details/93619747 9.1更新了: Java实现QQ微信轰炸...

Ben_小b
09/01
0
0
Java SE 6 Update 23 发布

Java 社区宣布 Java SE 6 Update 23 发布,内部版本号为 1.6.0_23-b05 … Java 技术的通用性、高效性、平台移植性和安全性,使之成为网络计算的理想技术。让您可以玩网络游戏、与世界各地的人...

红薯
2010/12/11
1K
2
Node.js 与java互相调用

我想用Node.js开发一个聊天程序独立于java的系统外 问题是Node.js 与java互相调用或通信。

jstat
2012/06/25
17.8K
3
java实现录音功能

最近开发的一个项目,需要用到录音的功能 用Java写的,需要在网页能够录音,然后能够保存起来,就像那个QQ的语音聊天一样。可以one to one, one to many, many tomany。主要是怎么现实录音...

耳麦
2014/04/10
2.3K
2

没有更多内容

加载失败,请刷新页面

加载更多

parseint和isNaN用法

本文转载于:专业的前端网站➭parseint和isNaN用法 <!doctype html><html><head><meta charset="utf-8"><title>无标题文档</title></head><body><script> var a='12'; alert......

前端老手
54分钟前
7
0
Kylin 精确去重在用户行为分析中的妙用

作者:史少锋,Apache Kylin committer & PMC,2019/10/11 在上次文章《如何在 1 秒内做到大数据精准去重》中,我们介绍了 Apache Kylin 为什么要支持大数据集上的精确去重,以及基于 Bitmap...

ApacheKylin
今天
5
0
学习记录(二) es6基本语法(rest参数,模板化,axios模块,拦截器)

日常学习记录 模块化:把一个大文件分成多个小文件,按照一定规范进行拼接 es5写法: 导出:module.exports = 数据 导入:require("路径") /路径未添加后缀名时 //默认添加.js //把路径作为文件名...

Pole丶逐
今天
4
0
以程序员的角度怎么购买一台「性价比高的电视」

前俩天有小伙伴在我的文章下留言,说能否把 【国内电视机都介绍一下】,今天我已在TV端开发多年的程序员的角度。谈谈已程序员的角度如何购买一台性价比高的电视。 国内大的电视机品牌介绍 长...

我们都很努力着
今天
5
0
PhotoShop 色调:理解直方图/RGB通道信息

一、直方图:图表的形式,展示图像像素分布的情况 1.平均值:表示平均亮度 2.标准偏差值:表示亮度值范围内的中间值 3.像素: 表示用于计算直方图的像素总数 4.色阶:显示指针下面的区域亮度...

东方墨天
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部