现在做一个类似即时通信的东西,服务器用java写,客户端在Android上面,两者用socket通信。
现在遇到的问题是:客户端可以发给服务器信息(服务器能够成功的收到),但是客户端却收不到服务器发来的数据,怎么回事啊?

解决方案 »

  1.   

    用过socket,没有遇到过楼主的情况
      

  2.   

    用户数据报协议(UDP)由Java 软件的DatagramSocket 和DatagramPacket 类支持。DatagramPacket 有两个构造函数:一个用来接收数据,另一个用来发送数据:
    l DatagramPacket(byte [] recvBuf, int readLength)-用来建立一个字节数组以接收UDP 包。byte 数
    组在传递给构造函数时是空的,而int 值用来设定要读取的字节数(不能比数组的大小还大)。
    l DatagramPacket(byte [] sendBuf, int sendLength, InetAddress iaddr, int iport)-用来建立将要传输的
    UDP 包。sendLength 不应该比sendBuf 字节数组的大小要大。DatagramSocket 用来读写UDP 包。这个类有三个构造函数,允许你指定要绑定的端口号和internet
    地址:
    l DatagramSocket()-绑定本地主机的所有可用端口
    l DatagramSocket(int port)-绑定本地主机的指定端口
    l DatagramSocket(int port, InetAddress iaddr)-绑定指定地址的指定端口楼主的端口号配置好了么
      

  3.   

    介绍一个框架给你把! 蛮方便的   MINA框架
      

  4.   

    public class AndroidObjectClientActivity extends Activity  
    {  
        private final String  DEBUG_TAG   = "Activity01";       
        private TextView    mTextView = null;  
        private EditText    mEditText = null;  
        private Button      mButton = null;  
        Socket socket;  
        private Handler messageHandler;
          
        @Override  
        public void onCreate(Bundle savedInstanceState)  
        {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);            
            mButton =(Button)findViewById(R.id.Button01);  
            mTextView = (TextView)findViewById(R.id.TextView01);  
            mEditText = (EditText)findViewById(R.id.EditText01);                                   
            class MessageHandler extends Handler
            {
                public MessageHandler(Looper looper)
                {
                    super(looper);
                }
                @Override       
                public void handleMessage(Message msg) 
                {                                          
                 try {                        
           mTextView.setText((String)msg.obj); 
                } finally{}                                
                }
            }
            
            new Thread()     //开启新的线程,获得服务器发来的数据。
            {
                @Override
                public void run() 
                {              
                 BufferedReader br;
                 String msg1=null;
    try {
    br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    msg1 = br.readLine();
    } catch (IOException e) {e.printStackTrace();}                                   
                 Message message1 = Message.obtain(); //创建一个Message对象,并把得到的天气信息赋值给Message对象     
                 message1.obj = msg1;
                    messageHandler.sendMessage(message1);//通过Handler发布携带有天气情况的消息
                }
            }.start();
            
            //建立socket连接
            try{
     socket = new Socket("**.**.**.**",6666);
    }catch (UnknownHostException e1) {e1.printStackTrace();} 
             catch (IOException e1) {e1.printStackTrace();} 
             System.out.println("Connected to " + socket.getRemoteSocketAddress());
                             
            //接收来自服务器的消息                     
            Looper looper = Looper.myLooper();
            messageHandler = new MessageHandler(looper);        
            
            mButton.setOnClickListener(new OnClickListener()  //点击发送按钮时,触发的操作。
            {  
                public void onClick(View v)  
                {  
                    String message = mEditText.getText().toString();   
                    SimpleDateFormat formater = new SimpleDateFormat("HH:mm:ss");
                  String time =formater.format(new Date());
                  String sendStr ="(" +time+")"+":"+message;
                    try   
                    {                                                         
                        //向服务器发送消息  
                        PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));        
                        out.println(sendStr);
                        out.flush();  
                        mEditText.setText("");
                        out.close();  //关闭流                                                             
                    }   catch (Exception e)    {   Log.e(DEBUG_TAG, e.toString());   }  
                }  
            }); 
        }
      

  5.   

    以上是客户端的代码,下面是服务器的代码:public class ObjectServer   
    {
        private static List<Socket> sockets = new ArrayList<Socket>();
        public ObjectServer() throws ClassNotFoundException
        {
       this.init();
        }

        //连接数据库
        public void db() throws SQLException,ClassNotFoundException
        {
         String user = "root";
         String pwd = "123";
         String myjdbc = "jdbc:sqlserver://localhost:1433/SMS server";
         Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
         Connection myConnection = DriverManager.getConnection(myjdbc, user, pwd);
         System.out.println("数据库连接成功!");
         Statement Myoperation = myConnection.createStatement();
         ResultSet record = Myoperation.executeQuery("SELECT * FROM role");
         while (record.next())
         {
         System.out.println(record.getInt("id") + "," + record.getString("name") + "," + record.getInt("score"));
         }
         try
         {
         if(record != null) record.close();
         }catch(Exception e){e.printStackTrace();}
         finally
         {
         try{
         if (myConnection != null) myConnection.close();
         }catch(Exception e){e.printStackTrace();}
         }
        }
    //启动监听
    public void init() throws ClassNotFoundException
        {
    ServerSocket serverSocket;
        try
            {
                     serverSocket = new ServerSocket(6666);
                     while(true)
                     {
                               Socket clientSocket = serverSocket.accept();                                                           
                               sockets.add(clientSocket);
                               Thread thread = new Thread(new ServerRunner(sockets,clientSocket));
                               thread.start();
                                                                                         
                     }
            }catch(IOException ioe){ ioe.printStackTrace();} 
        }

    //把某个客户端(管理员)发送过来的数据转发给所有的客户端
    class ServerRunner implements Runnable 
    {
             private List<Socket> sockets;
             private Socket currentSocket;
             public ServerRunner(List<Socket> sockets,Socket currentSocket)
             {
              this.sockets = sockets;
              this.currentSocket = currentSocket;
             }
    //@Override
    public void run() {
    String ip = currentSocket.getInetAddress().getHostAddress();
    BufferedReader br = null ;
    try{
    br = new BufferedReader(new InputStreamReader(currentSocket.getInputStream()));
    String str = null;
    while((str = br.readLine()) != null)
    {
    System.out.println(ip +  str);
    for(Socket temp : sockets)
    {
    PrintWriter pw = new PrintWriter(new OutputStreamWriter(temp.getOutputStream()));
    pw.println(str);
    pw.flush();
    }
    }
    }catch(IOException e){e.printStackTrace();}
    }
    }
    public static void main(String[] args)
    {
    try{
    new ObjectServer();
    } catch (ClassNotFoundException e) {e.printStackTrace();}
    }
    }
      

  6.   

    现在客户端出现的异常是:
    10-29 01:43:11.854: ERROR/AndroidRuntime(407): java.lang.NullPointerException
    10-29 01:43:11.854: ERROR/AndroidRuntime(407):     at com.pnf.transfer.AndroidObjectClientActivity$1.run(AndroidObjectClientActivity.java:80)
    10-29 01:43:11.894: WARN/ActivityManager(61):   Force finishing activity com.pnf.transfer/.AndroidObjectClientActivity