当前位置:编程学习 > wap >>

Android 开发类似微信的程序

想在安卓平台上开发一个类似微信的程序,有一个服务器,客户端登陆时服务器会给客户端分配一个IP地址,然后两个客户端之间可直接发送语音信息,信息的传递不通过服务器。该怎样实现信息传递? Android 微信 传递语音 --------------------编程问答-------------------- 服务器会给客户端分配一个ip?
--------------------编程问答-------------------- 跪求楼主的答案~老师布置的毕业设计。。。。无头绪 --------------------编程问答-------------------- LZ这是p2p通信啊穿墙技术,有点难,可以去了解下, --------------------编程问答-------------------- 那还要什么服务器啊。   --------------------编程问答-------------------- 那要服务器干嘛?开个录音功能,生成个mp3,直接发彩信。 --------------------编程问答--------------------
引用 3 楼 huangzuduan 的回复:
LZ这是p2p通信啊穿墙技术,有点难,可以去了解下,


socket可以吗 --------------------编程问答--------------------
引用 5 楼 hjywyj 的回复:
那要服务器干嘛?开个录音功能,生成个mp3,直接发彩信。


服务器用来动态分配IP --------------------编程问答--------------------
引用 1 楼 wjw2066616 的回复:
服务器会给客户端分配一个ip?


是的 --------------------编程问答-------------------- P2P技术 。不会PCM信号 iLBC压缩发送吧 --------------------编程问答--------------------
引用 9 楼 tom96202 的回复:
P2P技术 。不会PCM信号 iLBC压缩发送吧

呃,你说的好高深啊,我以为录音然后socket通信发送就行了呢,能具体说说吗 --------------------编程问答-------------------- 服务器给客户端分配IP?我觉得我的网络是白学了,那路由层是干什么的……服务器的IP是谁分配的……
------------------------------------------------------AutoCSDN签名档------------------------------------------------------ --------------------编程问答--------------------
ip不是服务器分配的把,客户登陆时可以用socket或是用servlet。客户端之间通信可以使用udp(datagramsocket) --------------------编程问答--------------------
引用 11 楼 hankcs 的回复:
服务器给客户端分配IP?我觉得我的网络是白学了,那路由层是干什么的……服务器的IP是谁分配的……
------------------------------------------------------AutoCSDN签名档------------------------------------------------------ --------------------编程问答--------------------
引用 12 楼 aaaabbbccd9876 的回复:

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

有例子木有啊,不要笑的呢么开心啊 --------------------编程问答--------------------
引用 14 楼 u011562884 的回复:
Quote: 引用 12 楼 aaaabbbccd9876 的回复:


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

有例子木有啊,不要笑的呢么开心啊
以前写了个,由于没有整理,没了 --------------------编程问答--------------------
引用 8 楼 u011562884 的回复:
Quote: 引用 1 楼 wjw2066616 的回复:

服务器会给客户端分配一个ip?


是的

 我告诉你是怎么回事吧   应该是你听错了或者理解错了。。。。不是服务器给动态分配的ip。。是客户端与服务器通信是服务器获得的客户端ip  你可以全程用UDP 来通信。是毕业设计么。。UDP足够了。。你的客户端只用一个socket当服务器获得你客户端的ip后告诉其他客户端。。然后他们之间就能通信了(这只是局域网的情况外网要稍复杂点)。。。或者靠服务器来转发消息也是可以的 --------------------编程问答-------------------- IP不是固定的么 --------------------编程问答-------------------- 我们课程作业,我写了个类似QQ这样的聊天程序,你要的话发给你 --------------------编程问答--------------------
引用 18 楼 jiangxiaoma111 的回复:
我们课程作业,我写了个类似QQ这样的聊天程序,你要的话发给你


太好了,你发到我邮箱吧,谢谢  wrh77@foxmail.com --------------------编程问答--------------------
引用 16 楼 wjw2066616 的回复:
Quote: 引用 8 楼 u011562884 的回复:

Quote: 引用 1 楼 wjw2066616 的回复:

服务器会给客户端分配一个ip?


是的

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


嗯,ip那个确实是我理解错了,老师后来说让客户端把IP和用户名一起发给服务器,然后服务器放到数据库中,这样另外的客户端通过用户名搜索时,服务器就把对应的ip发给他。两者通信我是想让两个手机互为socket的服务器端和客户端,你觉得可行么,Android上做socket服务器还没搞定 --------------------编程问答--------------------
引用 楼主 u011562884 的回复:
想在安卓平台上开发一个类似微信的程序,有一个服务器,客户端登陆时服务器会给客户端分配一个IP地址,然后两个客户端之间可直接发送语音信息,信息的传递不通过服务器。该怎样实现信息传递?

感觉逻辑有点乱哦
两个客户端是如何连接的?服务器基本上没有用了 --------------------编程问答--------------------
引用 21 楼 qiuqingpo 的回复:
Quote: 引用 楼主 u011562884 的回复:

想在安卓平台上开发一个类似微信的程序,有一个服务器,客户端登陆时服务器会给客户端分配一个IP地址,然后两个客户端之间可直接发送语音信息,信息的传递不通过服务器。该怎样实现信息传递?

感觉逻辑有点乱哦
两个客户端是如何连接的?服务器基本上没有用了

楼主的意思应该是,两个客户端 A 和 B 先连接到服务器上。然后服务器记录下这两个客户端的IP地址,然后 将A的IP地址给B,B的IP地址给A,这样,这两个客户端之间一方作为服务端(假设为A)的话,另外一方就可以使用A的IP地址来连接上去。他们之间的消息传递就可以直接点对点的了,不再需要通过服务器来中转了。
不知道的理解是否正确? --------------------编程问答--------------------
引用 22 楼 jiangxiaoma111 的回复:
Quote: 引用 21 楼 qiuqingpo 的回复:

Quote: 引用 楼主 u011562884 的回复:

想在安卓平台上开发一个类似微信的程序,有一个服务器,客户端登陆时服务器会给客户端分配一个IP地址,然后两个客户端之间可直接发送语音信息,信息的传递不通过服务器。该怎样实现信息传递?

感觉逻辑有点乱哦
两个客户端是如何连接的?服务器基本上没有用了

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


太对了,就是这样,可是怎么点对点呢 --------------------编程问答--------------------
引用 23 楼 u011562884 的回复:
Quote: 引用 22 楼 jiangxiaoma111 的回复:

Quote: 引用 21 楼 qiuqingpo 的回复:

Quote: 引用 楼主 u011562884 的回复:

想在安卓平台上开发一个类似微信的程序,有一个服务器,客户端登陆时服务器会给客户端分配一个IP地址,然后两个客户端之间可直接发送语音信息,信息的传递不通过服务器。该怎样实现信息传递?

感觉逻辑有点乱哦
两个客户端是如何连接的?服务器基本上没有用了

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


太对了,就是这样,可是怎么点对点呢


那就在手机客户端中再写一个 按照服务端的代码来写一个类似的, 就相当于手机既可以作为服务端又可以作为客户端这样的。 --------------------编程问答-------------------- 有个开源的消息服务器 openfire  楼主可以看下 --------------------编程问答--------------------
引用 24 楼 jiangxiaoma111 的回复:
Quote: 引用 23 楼 u011562884 的回复:

Quote: 引用 22 楼 jiangxiaoma111 的回复:

Quote: 引用 21 楼 qiuqingpo 的回复:

Quote: 引用 楼主 u011562884 的回复:

想在安卓平台上开发一个类似微信的程序,有一个服务器,客户端登陆时服务器会给客户端分配一个IP地址,然后两个客户端之间可直接发送语音信息,信息的传递不通过服务器。该怎样实现信息传递?

感觉逻辑有点乱哦
两个客户端是如何连接的?服务器基本上没有用了

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


太对了,就是这样,可是怎么点对点呢


那就在手机客户端中再写一个 按照服务端的代码来写一个类似的, 就相当于手机既可以作为服务端又可以作为客户端这样的。


现在就是这样写的,可是老是有异常,不能用 --------------------编程问答-------------------- 整一下异常代码出来嘛 --------------------编程问答--------------------
引用 27 楼 sybell 的回复:
整一下异常代码出来嘛


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
    }
    };
}
--------------------编程问答-------------------- 大家帮忙看看吧,或者哪位大神帮忙写写,指点指点,快到时间了,感激不尽啊 --------------------编程问答-------------------- 如果不依赖于服务器,则通信的终端既要做为服务端,又要做为客户端。之间采用socket通信。 --------------------编程问答--------------------
引用 30 楼 shaojieli 的回复:
如果不依赖于服务器,则通信的终端既要做为服务端,又要做为客户端。之间采用socket通信。


嗯,确实是这样想的,在同一个应用里既有客户端代码,又有服务器代码,并且内容显示在同一个界面上,你能帮我写写吗,是不是必须用线程 --------------------编程问答--------------------
引用 31 楼 u011562884 的回复:
Quote: 引用 30 楼 shaojieli 的回复:

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


嗯,确实是这样想的,在同一个应用里既有客户端代码,又有服务器代码,并且内容显示在同一个界面上,你能帮我写写吗,是不是必须用线程

就算你做普通的聊天程序,也要用到线程的吧 --------------------编程问答--------------------
引用 8 楼 u011562884 的回复:
Quote: 引用 1 楼 wjw2066616 的回复:

服务器会给客户端分配一个ip?


是的


最基本的IP是啥东西都没有搞清楚还开发个啥啊??? --------------------编程问答-------------------- 直接用socket
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,