zoukankan      html  css  js  c++  java
  • android socket通信

    一、创建服务器的步骤

          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[1024];

             int currrent = -1;

             int i=0;

             while((currrent= bis.read())!=-1){

                 byte a[i] = (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;

                   }

              }

     以下附代码实例

    Client
     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             @Override
    18             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                     }else
    38                         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 }
    Server
     1 public  class Server implements Runnable{
     2 
     3     @Override
     4     public void run() {
     5         System.out.println("run");
     6         try{
     7             ServerSocket severSocket = new ServerSocket(54321);
     8             System.out.println("severSocket");
     9             while(true){
    10                 System.out.println("true");
    11                 //接收客户端请求
    12                 Socket client = severSocket.accept();
    13                 System.out.println("accept");
    14                 try{
    15                     //接受客户端消息
    16                     InputStream is = client.getInputStream();
    17                     InputStreamReader isr = new InputStreamReader(is);
    18                     BufferedReader in = new BufferedReader(isr);
    19                     
    20                     String str = in.readLine();                                        
    21                     System.out.println("read:"+str);
    22                     
    23                     /*System.out.println("请在键盘上输入你想输入的内容,输完后按回车结束:");
    24                     Scanner inn=new Scanner(System.in);
    25                     String strr=inn.next();
    26                     System.out.println("您刚才在键盘输入的信息是:"+strr);*/
    27 
    28                     
    29                     //向客户端发送消息
    30                     OutputStream os = client.getOutputStream();
    31                     OutputStreamWriter osr = new OutputStreamWriter(os);
    32                     BufferedWriter bw = new BufferedWriter(osr);
    33                     PrintWriter out = new PrintWriter(bw,true);
    34                     //解决中文乱码
    35                     String strrr = "此处写服务器想发送给客户端的消";
    36                     byte a[] = new byte[1024];
    37                     a = strrr.getBytes(strrr);
    38                     String strend = new String(a,"gb2312");
    39 
    40                     out.println(strend);
    41                     
    42                     //关闭流
    43                     in.close();
    44                     out.close();    
    45                 }catch(Exception e){
    46                     System.out.println(e.getMessage());
    47                     System.out.println("222");
    48                     e.printStackTrace();
    49                 }
    50                 finally{
    51                     client.close();
    52                     System.out.println("close");
    53                 }
    54             }
    55         }catch(Exception e){
    56             System.out.println(e.getMessage());
    57             System.out.println("333");
    58         }
    59     }
    60 //main函数,开启服务器
    61     public static void main(String a[]){
    62         Thread deskTopServerThread = new Thread(new Server());
    63         deskTopServerThread.start();                
    64     }
    65 }
  • 相关阅读:
    Springboot如何优雅的解决ajax+自定义headers的跨域请求
    提升开发效率的一款mybatis开发神器
    深究Spring中Bean的生命周期
    阿里Canal框架(数据同步中间件)初步实践
    从技术角度分析推荐系统案例
    记一次token安全认证的实践
    为什么Redis 单线程却能支撑高并发?
    Python 派生类子类继承类
    Python 定制类与其对象的创建和应用
    Python 字典的创建赋值和动态扩展
  • 原文地址:https://www.cnblogs.com/wyqfighting/p/2695186.html
Copyright © 2011-2022 走看看