0
点赞
收藏
分享

微信扫一扫

android的SOCKET网络编程

Socket又称套接字,应用程序通常通过“套接字”向网络发出请

 求或者应答网络请求

 在JAVA中,Socket和ServerSocket类库位于java.net中。

 ServerSocket用于服务器端,Socket是建立网络时使用的。在连

 接成功时,应用程序两端都会产生一个Socket实例,操作这个实

 例,完成所需的会话。对于一个网络连接来说,
 套接字是平等的

 ,并没有差别,不因为在服务器端或在客户端而产生不同级别。

 不管是Socket还是ServerSocket他们的工作都是通过Socket类及

 其子类来完成的




 Socket链接的建立过程

 1.服务器监听

 2.客户端发出请求

 3.建立链接

 4.通信





 Socket特点

 1.Socket基于TCP链接,数据传输有保障

 2.Socket适用于建立长时间链接

 3.Socket编程通常应用于即时通讯






 服务器端ServerSocket

 package com.enenya.serversocket;

 import java.io.IOException;
 import java.io.OutputStream;
 import java.net.ServerSocket;
 import java.net.Socket;

 public class SimpleSocket {
     public static void main(String[] str) {
         try {
             //创建一个ServerSocket,并且给定

 侦听端口,
             ServerSocket serverSocket = new 

 ServerSocket(30000);
             while (true) {
                 //accept()方法会阻塞线程
                 Socket socket = 

 serverSocket.accept();
                 //
                 OutputStream outputStream 

 = socket.getOutputStream();
                 outputStream.write("你好

 !Socket已接受到。".getBytes());
                 outputStream.close();
                 socket.close(); 
             }
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
 }

















 服务器端编程

 1. 新建一个线程类负责循环接收socket请求
 package com.enenya.serversocket;

 import java.io.IOException;
 import java.net.ServerSocket;
 import java.net.Socket;

 //创建一个类继承Socket,并且是接受socket请求
 public class ServerListener extends Thread {
     public void run() { 
         try {
             // 创建一个ServerSocket,并且给定

 侦听端口,端口是1-65535
             ServerSocket serverSocket = new 

 ServerSocket(30001);
             // 因为客户端会有很多个请求,所以

 需要创建多一个Socket实例
             while (true) {
                 // accept()方法会阻塞线程
                 Socket socket = 

 serverSocket.accept();
                 new ChatSocket

 (socket).start(); 
                 //serverSocket.close();
             }
         } catch (IOException e) {
             e.printStackTrace();
         }  
     }
 }



 2.新建一个线程类,负责写出信息
 package com.enenya.serversocket;

 import java.io.IOException;
 import java.io.OutputStream;
 import java.net.Socket;

 //创建一个线程类,负责发送数据到客户端
 public class ChatSocket extends Thread {
     Socket socket;

     public ChatSocket(Socket s) {
         this.socket = s;
     }

     public void run() {
         try {
             OutputStream outputStream = 

 socket.getOutputStream();
             outputStream.write("你好!Socket

 已接受到。".getBytes());
             outputStream.close();
             socket.close();
         } catch (IOException e) {
             e.printStackTrace();
         }

     }
 }



 3.调用
 package com.enenya.serversocket;


 public class SimpleSocket {
     public static void main(String[] str) {
         new ServerListener().start();
     } 
 }





















 完整的Socket网络编程
 多用户输入,响应,并且同步的聊天室

 1.新建一个类继承Thread,负责接收客户端发送的请求
 package com.enenya.serversocket;

 import java.io.IOException;
 import java.net.ServerSocket;
 import java.net.Socket;

 //创建一个类继承Socket,并且是接受socket请求
 public class ServerListener extends Thread {
     public void run() { 
         try {
             // 创建一个ServerSocket,并且给定

 侦听端口,端口是1-65535
             ServerSocket serverSocket = new 

 ServerSocket(30002);
             // 因为客户端会有很多个请求,所以

 需要创建多一个Socket实例
             while (true) {
                 // accept()方法会阻塞线程
                 Socket socket = 

 serverSocket.accept();
                 ChatSocket chatSocket = 

 new ChatSocket(socket); 
                 chatSocket.start();
                 

 ChatThreadManager.getChatManager().add(chatSocket);
                 
             }
         } catch (IOException e) {
             e.printStackTrace();
         }  
     }
 }



 2.新建一个类继承Thread,负责发送消息
 package com.enenya.serversocket;

 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
 import java.net.Socket;

 //创建一个线程类,负责发送数据到客户端
 public class ChatSocket extends Thread {
     Socket socket;

     public ChatSocket(Socket s) {
         this.socket = s;
     }

     public void out(String str) {
         try {
             OutputStream outputStream = 

 socket.getOutputStream();
             outputStream.write(("你好!Socket

 已接受到。是:" + str).getBytes());
             outputStream.close();
             socket.close();
         } catch (IOException e) {
             e.printStackTrace();
         }
     }

     @Override
     public void run() {
         try {
             BufferedReader bReader = new 

 BufferedReader(new InputStreamReader(
                     

 socket.getInputStream(), "UTF-8"));
             String line = null;
             while ((line = bReader.readLine

 ()) != null) {
                 

 ChatThreadManager.getChatManager().publish(this, line);
             }
             bReader.close();
         } catch (UnsupportedEncodingException e) 

 {
             // TODO Auto-generated catch 

 block
             e.printStackTrace();
         } catch (IOException e) {
             // TODO Auto-generated catch 

 block
             e.printStackTrace();
         } 
     }
 }



 3.新建一个类,负责将输入消息加入队列,并且循环发送出去
   package com.enenya.serversocket;

 import java.util.Vector;

 //负责将客户端发送过来的数据在线程间通信
 public class ChatThreadManager {
     // 表示该类不能被实例化
     private ChatThreadManager() {
     }

     // 该类必须是单例模式
     private static final ChatThreadManager CTM = new 

 ChatThreadManager();

     public static ChatThreadManager getChatManager() 

 {
         return CTM;
     }

     
     //线程安全的集合
     Vector<ChatSocket> vector = new 

 Vector<ChatSocket>();
     
     public void add(ChatSocket cs) {
         vector.add(cs);
     }

     public void publish(ChatSocket cs, String out) {
         for (int i = 0; i < vector.size(); i++) {
             ChatSocket csChatSocket = 

 vector.get(i);
             //如果当前socket对象不是要发送的

 对象,就发送数据
             if(!cs.equals(csChatSocket)){
                 csChatSocket.out(out);     
             }
         }
     }

 }



 4.服务器端启动
 package com.enenya.serversocket;


 public class SimpleSocket {
     public static void main(String[] str) {
         new ServerListener().start();
     } 
 }
  




 5.android客户端发送消息到服务器
 package com.example.android_clientsocket;

 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.net.Socket;
 import java.net.UnknownHostException;

 import android.os.Bundle;
 import android.app.Activity; 
 import android.widget.TextView;

  public class MainActivity extends Activity {
     private TextView textView;

     @Override
     protected void onCreate(Bundle 

 savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         textView = (TextView) this.findViewById

 (R.id.textview1);
         
         new Thread(runnable).start();
     }

     private Runnable runnable = new Runnable() {
         @Override
         public void run() {
             try {
                 Socket socket = new 

 Socket("172.28.232.1", 30002);
                 socket.setSoTimeout

 (10000);
                 BufferedReader 

 brBufferedReader = new BufferedReader(
                         new 

 InputStreamReader(socket.getInputStream()));
                 String string = 

 brBufferedReader.readLine();
                 textView.setText(string);
                 brBufferedReader.close();
                 socket.close();
                 
             } catch (UnknownHostException e) 

 {
                 e.printStackTrace();
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
     };

 }


 或者


 在activity方法,点击某个按钮发送的消息

 Socket socket = null;
 BufferdWriter writer = null;
 BufferdReader reader = null;
 public void connect(){
   try{
       socket = new Socket("127.0.0.1",30002);
         writer = new BufferdWriter(new 

 OutputStreamWriter(socket.getOutputStream()));
         reader = new BufferedReader(new 

 InputStreamReader(socket.getInputStream()));
     
     AsynTask<Void,String,Void> read = new 

 AsynTask<Void,String,Void>(){
     
     @Override
         protected void doInBackground(Void... arg0){
         String line = "";
         while((line = reader.readLine()) != null){
          publishProgress(line);
         }
     }

         };
     read.execute();
   }catch(UnknownHostException e){
      Toast.make(this,"无法建立链接!",1).show();
   }catch(IOException e){
     Toast.make(this,"无法建立链接!",1).show();
   }
   

 }

    public void send(){
     try{
         write.write(editText.getText().toString

 ());    
     editText.setText("");
        }catch(Exception e){}
    }

举报

相关推荐

0 条评论