little_star 发表于 2013-1-3 16:53:31

android socket通信

<div id="cnblogs_post_body">
一、创建服务器的步骤
      1、指定端口实例化一个ServerSocket
         ServerSocket severSocket = new ServerSocket(54321);
      2、调用ServerSocket的accept()开始监听客户端的连接,并取得客户端的Socket对象client
         Socket client = severSocket.accept();
      3、获取位于底层Socket的流,以进行读写操作
         //接受客户端的消息
            InputStream is = client.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader in = new BufferedReader(isr);   
            String str =in.readLine();
        //向客户端发送消息
            OutputStream os = client.getOutputStream();
            OutputStreamWriter osr = new OutputStreamWriter(os);
            BufferedWriter bw = new BufferedWriter(osr);
            PrintWriter out = new PrintWriter(bw,true);
            out.println("server message");
         
         4、关闭打开的流(注意:先关闭Writer,后关闭Reader)
         in.close();
         out.close();

二、创建客户端的步骤
      1、通过服务器的IP地址和端口实例化一个Socket,请求连接服务器
         socket = new Socket("ipdizhi",54321);
      2、获取Socket上的流进行读写操作,把流包装进BufferedReader/PrintWriter的实例;并对socket进行读写
      3、关闭流

三、网络通信中的乱码问题
原因:通信过程中使用了不同的编码方式:服务器中的、传输过程中的,终端设备的
办法:getBytes("编码方式");//对汉字进行重编码,得到它的字节数组
      new String(Bytes[],"解码方式");//对字节数组进行相应的编码
实例:1、将流先转换为字节,再将字节按GB2312的方式转换得到字符串
         InputStream is = con.getInputStream();
         BufferedInputStream bis= new BufferedInputStream(is));
         byte a[] = new byte;
         int currrent = -1;
         int i=0;
         while((currrent= bis.read())!=-1){
             byte a = (byte)current;
             i++;
         }
         result = new String(a,"GB2312");

          2、在数据传递过程中使用ISO-8859-1字符集,在传递到终端设备时,将数据反转
          public static String FormotStr(String str){
            if(str==null||str=="") return "";
            try{
                     return new String(str.getBytes("ISO-8859-1"),"bgk");
               }catch (UnsupportedEncodingException e){
                     return str;
               }
          }


以下附代码实例
<div class="cnblogs_code" >http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gifhttp://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gifClient<div id="cnblogs_code_open_b350c1d4-bffb-4626-9ba5-df5603fa7018" class="cnblogs_code_hide"> 1 public class Client extends Activity{ 2   private TextView mTextView = null; 3   private EditText mEditText = null; 4   private Button mButton = null; 5    6     @Override 7   public void onCreate(Bundle savedInstanceState) { 8         super.onCreate(savedInstanceState); 9       setContentView(R.layout.socket);10         11         mTextView = (TextView)findViewById(R.id.textView1);12         mEditText = (EditText)findViewById(R.id.editText1);13         mButton = (Button)findViewById(R.id.button1);14         15         mButton.setOnClickListener(new OnClickListener() {16             17             @Override18             public void onClick(View v) {19               Socket socket = null;20               String str = mEditText.getText().toString();21               try{22                     socket = new Socket("ipdizhi",54321);23                     //向服务器发送消息24                     OutputStream os = socket.getOutputStream();25                     OutputStreamWriter osr = new OutputStreamWriter(os);26                     BufferedWriter bw = new BufferedWriter(osr);27                     PrintWriter out = new PrintWriter(bw,true);28                   out.println(str);29                     30                     //接收来自服务器的消息31                     InputStream is = socket.getInputStream();32                     InputStreamReader isr = new InputStreamReader(is);33                     BufferedReader br = new BufferedReader(isr);34                     String msg = br.readLine();35                     if(msg!=null){36                         mTextView.setText(msg);37                     }else38                         mTextView.setText("数据错误");39                     40                   out.close();41                   br.close();42                   socket.close();                                                      43               }catch(Exception e){44                     Log.e("socket",e.getMessage()+"close");45                   e.printStackTrace();46                 }47               48             }49       }); 50     }51 52 }
页: [1]
查看完整版本: android socket通信