解决方案 »

  1.   

    LZ这是p2p通信啊穿墙技术,有点难,可以去了解下,
      

  2.   

    P2P技术 。不会PCM信号 iLBC压缩发送吧
      

  3.   

    呃,你说的好高深啊,我以为录音然后socket通信发送就行了呢,能具体说说吗
      

  4.   

    服务器给客户端分配IP?我觉得我的网络是白学了,那路由层是干什么的……服务器的IP是谁分配的……
    ------------------------------------------------------AutoCSDN签名档------------------------------------------------------
      

  5.   


    ip不是服务器分配的把,客户登陆时可以用socket或是用servlet。客户端之间通信可以使用udp(datagramsocket)
      

  6.   

    引用 11 楼 hankcs 的回复:
    服务器给客户端分配IP?我觉得我的网络是白学了,那路由层是干什么的……服务器的IP是谁分配的……
    ------------------------------------------------------AutoCSDN签名档------------------------------------------------------
      

  7.   


    是的
     我告诉你是怎么回事吧   应该是你听错了或者理解错了。不是服务器给动态分配的ip。。是客户端与服务器通信是服务器获得的客户端ip  你可以全程用UDP 来通信。是毕业设计么。。UDP足够了。。你的客户端只用一个socket当服务器获得你客户端的ip后告诉其他客户端。。然后他们之间就能通信了(这只是局域网的情况外网要稍复杂点)或者靠服务器来转发消息也是可以的
      

  8.   


    太好了,你发到我邮箱吧,谢谢  [email protected]
      

  9.   


    是的
     我告诉你是怎么回事吧   应该是你听错了或者理解错了。不是服务器给动态分配的ip。。是客户端与服务器通信是服务器获得的客户端ip  你可以全程用UDP 来通信。是毕业设计么。。UDP足够了。。你的客户端只用一个socket当服务器获得你客户端的ip后告诉其他客户端。。然后他们之间就能通信了(这只是局域网的情况外网要稍复杂点)或者靠服务器来转发消息也是可以的嗯,ip那个确实是我理解错了,老师后来说让客户端把IP和用户名一起发给服务器,然后服务器放到数据库中,这样另外的客户端通过用户名搜索时,服务器就把对应的ip发给他。两者通信我是想让两个手机互为socket的服务器端和客户端,你觉得可行么,Android上做socket服务器还没搞定
      

  10.   

    感觉逻辑有点乱哦
    两个客户端是如何连接的?服务器基本上没有用了
    楼主的意思应该是,两个客户端 A 和 B 先连接到服务器上。然后服务器记录下这两个客户端的IP地址,然后 将A的IP地址给B,B的IP地址给A,这样,这两个客户端之间一方作为服务端(假设为A)的话,另外一方就可以使用A的IP地址来连接上去。他们之间的消息传递就可以直接点对点的了,不再需要通过服务器来中转了。
    不知道的理解是否正确?
      

  11.   

    感觉逻辑有点乱哦
    两个客户端是如何连接的?服务器基本上没有用了
    楼主的意思应该是,两个客户端 A 和 B 先连接到服务器上。然后服务器记录下这两个客户端的IP地址,然后 将A的IP地址给B,B的IP地址给A,这样,这两个客户端之间一方作为服务端(假设为A)的话,另外一方就可以使用A的IP地址来连接上去。他们之间的消息传递就可以直接点对点的了,不再需要通过服务器来中转了。
    不知道的理解是否正确?太对了,就是这样,可是怎么点对点呢
      

  12.   

    感觉逻辑有点乱哦
    两个客户端是如何连接的?服务器基本上没有用了
    楼主的意思应该是,两个客户端 A 和 B 先连接到服务器上。然后服务器记录下这两个客户端的IP地址,然后 将A的IP地址给B,B的IP地址给A,这样,这两个客户端之间一方作为服务端(假设为A)的话,另外一方就可以使用A的IP地址来连接上去。他们之间的消息传递就可以直接点对点的了,不再需要通过服务器来中转了。
    不知道的理解是否正确?太对了,就是这样,可是怎么点对点呢那就在手机客户端中再写一个 按照服务端的代码来写一个类似的, 就相当于手机既可以作为服务端又可以作为客户端这样的。
      

  13.   

    有个开源的消息服务器 openfire  楼主可以看下
      

  14.   

    感觉逻辑有点乱哦
    两个客户端是如何连接的?服务器基本上没有用了
    楼主的意思应该是,两个客户端 A 和 B 先连接到服务器上。然后服务器记录下这两个客户端的IP地址,然后 将A的IP地址给B,B的IP地址给A,这样,这两个客户端之间一方作为服务端(假设为A)的话,另外一方就可以使用A的IP地址来连接上去。他们之间的消息传递就可以直接点对点的了,不再需要通过服务器来中转了。
    不知道的理解是否正确?太对了,就是这样,可是怎么点对点呢那就在手机客户端中再写一个 按照服务端的代码来写一个类似的, 就相当于手机既可以作为服务端又可以作为客户端这样的。现在就是这样写的,可是老是有异常,不能用
      

  15.   


    package com.example.map2;import java.io.DataInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.PrintStream;
    import java.net.InetAddress;
    import java.net.NetworkInterface;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.net.SocketException;
    import java.net.UnknownHostException;
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.Enumeration;
    import java.util.List;import org.apache.http.conn.util.InetAddressUtils;import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.WindowManager;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ListView;
    import android.widget.TextView;public class Communication extends Activity{
       private Button bt,btback,btadd;
       private TextView tv;
       private Socket socket;
       private String serverIpAddress;
       private ListView mListView;
     
       private ChatMsgViewAdapterRight mAdapterright;
       private ChatMsgViewAdapterLeft mAdapterleft;
       private EditText et;
       private List<ChatMsgEntity> mDataArrays = new ArrayList<ChatMsgEntity>();
       LayoutInflater mLayoutInflater = null;    private static final int REDIRECTED_SERVERPORT = 6000;
      
       public void onCreate(Bundle savedInstanceState) {
       
          super.onCreate(savedInstanceState);
          setContentView(R.layout.comunication);
          mLayoutInflater = LayoutInflater.from(this);
        //启动activity时不自动弹出软键盘
          getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);        bt = (Button) findViewById(R.id.btn_send);
          btback = (Button) findViewById(R.id.communicate_back_btn);
          btadd = (Button) findViewById(R.id.add_btn2);       
          tv = (TextView) findViewById(R.id.myTextView);
          mListView = (ListView) findViewById(R.id.listview);
          et = (EditText) findViewById(R.id.et_sendmessage);
          serverIpAddress=getLocalIpAddress();
         
    new Thread(new Runnable() {
      public void run() {
          
          try{
             ServerSocket server =new ServerSocket( REDIRECTED_SERVERPORT);//在该端口监听
             while(true)
             {
             Socket client =server.accept();//接受客户端请求
            InputStream is=client.getInputStream();
             OutputStream os=client.getOutputStream();
             DataInputStream dis=new DataInputStream(is);
             String request=dis.readLine();
             PrintStream out=new PrintStream(os);//取得客户端输出流
             out.print(request);
           client.close();
           server.close();
             }
             
          }catch (UnknownHostException e) {
                   tv.setText("ServerError1:"+e);
                   e.printStackTrace();
                } catch (IOException e) {
                  tv.setText("ServerError2:"+e);
                   e.printStackTrace();
                } catch (Exception e) {
                   tv.setText("ServerError3:"+e);
                   e.printStackTrace();
                }
          handler.sendEmptyMessage(0);
           }
     }).start();       bt.setOnClickListener(new OnClickListener() {
                  
             public void onClick(View v) {
              new Thread(new Runnable() {
                public void run() {
              String str = et.getText().toString();
              if (str.length() > 0)
              {
            
           
              try {
              ChatMsgEntity entity = new ChatMsgEntity();
            entity.setDate(getDate());
            entity.setName("本人");
            entity.setMsgType(false);
            entity.setText(str);
            mDataArrays.add(entity);
            mAdapterright.notifyDataSetChanged();
            et.setText("");
            mListView.setSelection(mListView.getCount() - 1);
           
                   InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
                   socket = new Socket(serverAddr, REDIRECTED_SERVERPORT);//创建连接到对方IP,6000端口号的socket
                   InputStream is=socket.getInputStream();
                   OutputStream os=socket.getOutputStream();
                   PrintStream out = new PrintStream(os);
                   out.println(str);
                   DataInputStream dis=new DataInputStream(is);
                   String request =dis.readLine();
                   ChatMsgEntity entity2 = new ChatMsgEntity();
              entity2.setDate(getDate());
              entity2.setName("朋友");
              entity2.setMsgType(false);
              entity2.setText(request );
              mDataArrays.add(entity2);
              mAdapterleft.notifyDataSetChanged();     
              mListView.setSelection(mListView.getCount() - 1);
                   socket.close();
                  // Log.d("Client", "Client sent message");
                } catch (UnknownHostException e) {
                   tv.setText("Error1:"+e);
                   e.printStackTrace();
                } catch (IOException e) {
                   tv.setText("Error2:"+e);
                   e.printStackTrace();
                } catch (Exception e) {
                   tv.setText("Error3:"+e);
                   e.printStackTrace();
                }
             }
              handler.sendEmptyMessage(0);
                }  
            
          }).start();
            }
          });
          
                  
          btback.setOnClickListener(new OnClickListener() {
             public void onClick(View v) {
              finish(); 
             }           
             });
          btadd.setOnClickListener(new OnClickListener() {
             public void onClick(View v) {
              finish();
             }           
             });
       }
       private String getDate() {
            Calendar c = Calendar.getInstance();         String year = String.valueOf(c.get(Calendar.YEAR));
            String month = String.valueOf(c.get(Calendar.MONTH));
            String day = String.valueOf(c.get(Calendar.DAY_OF_MONTH) + 1);
            String hour = String.valueOf(c.get(Calendar.HOUR_OF_DAY));
            String mins = String.valueOf(c.get(Calendar.MINUTE));
                     
            StringBuffer sbBuffer = new StringBuffer();
            sbBuffer.append(year + "-" + month + "-" + day + " " + hour + ":" + mins); 
                     
            return sbBuffer.toString();
        }
       
       public static String getLocalIpAddress(){

    try{
     for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
     NetworkInterface intf = en.nextElement();  
                    for (Enumeration<InetAddress> enumIpAddr = intf  
                            .getInetAddresses(); enumIpAddr.hasMoreElements();) {  
                        InetAddress inetAddress = enumIpAddr.nextElement();  
                        if (!inetAddress.isLoopbackAddress() && InetAddressUtils.isIPv4Address(inetAddress.getHostAddress())) {  
                            
                         return inetAddress.getHostAddress().toString();  
                        }  
                    }  
     }
    }catch (SocketException e) {
    // TODO: handle exception

    }

    return null; 
    }
     //定义Handler对象
       private Handler handler =new Handler(){
        @Override
        //当有消息发送出来的时候就执行Handler的这个方法
       public void handleMessage(Message msg){
        super.handleMessage(msg);
       //处理UI
        }
        };
    }
      

  16.   

    如果不依赖于服务器,则通信的终端既要做为服务端,又要做为客户端。之间采用socket通信。
      

  17.   

    呃,你说的好高深啊,我以为录音然后socket通信发送就行了呢,能具体说说吗安卓平台 录音会得到 8位的PCM音频信号。   通过压缩算法压缩一下音频资源, 然后在通过网络环节发送出去  
      

  18.   

    能不能把你的你毕业设计发我一份 谢谢  邮箱:[email protected]
      

  19.   

    我现在有一个课程作业是要做一个和你相似的东西,也是实现客户端之间的直接通信,不过不是发语音,是实现类似微信的朋友圈。完全没有头绪呀,能不能把你的毕业设计发我一份呢,非常感谢呀 邮箱:[email protected]