zoukankan      html  css  js  c++  java
  • android关于socket编程,以聊天为例【转】http://hi.baidu.com/yaoyuanhuajx/item/9b93d7565f315ba9acc857d7

    一步一步android(15):关于socket编程【以聊天为例】

    Android手机的应用,除了它的手机功能之外,另外一个吸引人的地方在于它的开放性,这一点iphone无法比拟,至少iphone太多商业化气息。

    如同当年windows95一样,android为我们开启另一扇交流之窗,而要实现交流,socket通信必不可少。

    java在socket通信方面上已经有了很好的范例,我只是抛砖引玉,将其引入到android之中,疏漏之处在所难免,很多地方也值得深思与考量,高手不必拍砖,可跳过此文。

    下面,用敲门的方式演示Android如何实现套接字的通信。

    本例实现功能如下:

    Server端开启服务
    Client端发起链接请求,并向Server端发送数据
    Server端响应请求,并在Server显示,向Client端返回数据
    Client端接收Server的数据并显示

    本例效果如下:

    终端1:

    终端2:

    Server端:

    本例源代码如下:

    Server端:

    package com.android.Yao;

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.ServerSocket;
    import java.net.Socket;

    public class YaoChatServer extends Thread {

    private YaoChatServer() throws IOException {
       CreateSocket();
       //创建Socket服务器
    }

    public void run() { 
       Socket client;
       String txt;
       try { 
        while (true)
        //线程无限循环,实时监听socket端口
        {
         client=ResponseSocket();       
         //响应客户端链接请求。。
        
         while(true)
         {
          txt=ReceiveMsg(client);  
          System.out.println(txt);
          //链接获得客户端发来消息,并将其显示在Server端的屏幕上
       
          SendMsg(client,txt);
          //向客户端返回消息

          if(true)break;
          //中断,继续等待链接请求
         }
        
         CloseSocket(client);
         //关闭此次链接
        }   
       } 
       catch (IOException e) {
        System.out.println(e);
       }

    }

    private ServerSocket server = null;
    private static final int PORT = 5000;
    private BufferedWriter writer;
    private BufferedReader reader;

    private void CreateSocket() throws IOException
    {
       server = new ServerSocket(PORT, 100);
       System.out.println("Server starting..");  
    }

    private Socket ResponseSocket() throws IOException
    {
       Socket client = server.accept(); 
       System.out.println("client connected..");
      
       return client;
    }

    private void CloseSocket(Socket socket) throws IOException
    {
       reader.close();
       writer.close();
       socket.close();
       System.out.println("client closed..");
    }

    private void SendMsg(Socket socket,String Msg) throws IOException 
    {
       writer = new BufferedWriter(
          new OutputStreamWriter(socket.getOutputStream()));
        writer.write(Msg+"\n");
        writer.flush();
       
    }

    private String ReceiveMsg(Socket socket) throws IOException
    {
       reader = new BufferedReader(
         new InputStreamReader(socket.getInputStream()));     
        System.out.println("server get input from client socket..");
        String txt="Sever send:"+reader.readLine();
       
        return txt;
    }

    public static void main(final String args[]) throws IOException {
       YaoChatServer yaochatserver = new YaoChatServer();
       if (yaochatserver != null) {
        yaochatserver.start();
       }
    }

    }

    Client端:

    package com.android.Yao;

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.net.UnknownHostException;

    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.Socket;
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.*;


    public class YaoChatRoomAndroid extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.chatroom);
           

            findviews();
            setonclick();

        }

        private EditText chattxt;
        private TextView chattxt2;
        private Button chatok;
        
        public void findviews()
        {
            chattxt = (EditText)this.findViewById(R.id.chattxt);
            chattxt2 = (TextView)this.findViewById(R.id.chattxt2);
            chatok   = (Button)this.findViewById(R.id.chatOk);
        }
        
        private void setonclick()
        {
            chatok.setOnClickListener(new View.OnClickListener() {
       
        @Override
        public void onClick(View v) {
         try {
          connecttoserver(chattxt.getText().toString());
         } catch (UnknownHostException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
         } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
         }
        }
       });
        }


        public void connecttoserver(String socketData) throws UnknownHostException, IOException
    {
        Socket socket=RequestSocket("192.168.0.107",5000);
       SendMsg(socket,socketData);  
       String txt = ReceiveMsg(socket);
       this.chattxt2.setText(txt);    
    }

        
        private Socket RequestSocket(String host,int port) throws UnknownHostException, IOException
        {   
        Socket socket = new Socket(host, port);
        return socket;
        }
        
        private void SendMsg(Socket socket,String msg) throws IOException
        {
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
       writer.write(msg.replace("\n", " ")+"\n");
       writer.flush();
        }
        
        private String ReceiveMsg(Socket socket) throws IOException
        {
        BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        
       String txt=reader.readLine();
       return txt;

        }    
    }

  • 相关阅读:
    【Codeforces 933A】A Twisty Movement
    【Codeforces 996B】World Cup
    【Codeforces 469B】Chat Online
    鼠标点击后的CSS3跑马灯效果
    CSS的相对定位和绝对定位
    CSS3制作的一款按钮特效
    单元测试小结
    JS对输入判断变化屏蔽中文输入法输入时连续触发事件的方法
    jquery的load方法
    MVC视图特性
  • 原文地址:https://www.cnblogs.com/songtzu/p/2883622.html
Copyright © 2011-2022 走看看