zoukankan      html  css  js  c++  java
  • socket android

    参考

    http://www.cnblogs.com/dyllove98/p/3149581.html

    http://www.cnblogs.com/skyseraph/archive/2012/03/12/2391601.html

    一、socket传输模式

    两种:TCP, UDP 

    二、android与服务器通信主要的两种方式

    一种是http ,一种是socket.

    两者不同:

    http使用的“请求-响应”方式。也就是请求时建立 连接通道,当客户端向服务器发送请求后,服务器才返回数据。

    socket则是在双方建立起直接进行数据传输,在连接时可以实现数据的主动推送,而不用每资助由客户端发送请求。

    三、服务器代码 

    package chuiyuan.server;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    
    public class TcpServer{
    	//
    	private static final int SERVER_PORT=8888;
    	private static List<Socket> mClientSockets = new ArrayList<Socket>();
    	//线程池
    	private ExecutorService mExecutorService ;
    	private ServerSocket mServerSocket ;
    	//start server
    	public static void main (String [] args ){
    		new TcpServer() ;
    	}
    	//constructor 
    	public TcpServer(){
    		try {
    			mServerSocket = new ServerSocket(SERVER_PORT);
    			//创建 一个线程池
    			mExecutorService = Executors.newCachedThreadPool() ;
    			System.out.println("start...");
    			Socket client = null;
    			while (true) {
    				client = mServerSocket.accept() ;
    				mClientSockets.add(client) ;
    				//开一个客户端线程
    				mExecutorService.execute(new ThreadServer(client)) ;
    			}
    		} catch (IOException e) {
    			e.printStackTrace() ;
    		}
    	}
    	//每个客户端单独开启一个线程
    	static class ThreadServer implements Runnable{
    		private Socket mSocket ;
    		private BufferedReader mBufferedReader ;
    		private PrintWriter mPrintWriter ;
    		private String mStrMsg ;
    		
    		public ThreadServer (Socket socket) throws IOException{
    			mSocket = socket ;
    			mBufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    			mStrMsg = "user:"+this.mSocket.getInetAddress()+" come total:"+mClientSockets.size() ;
    			sendMsg ();
    		}
    		 //发送消息给所有客户端
    		private void sendMsg() throws IOException{
    			System.out.println(mStrMsg) ;
    			for (Socket client: mClientSockets){
    				mPrintWriter = new PrintWriter(client.getOutputStream(), true) ;
    				mPrintWriter.println(mStrMsg) ;
    			}
    			
    		}
    		public void run() {
    			try {
    				while ((mStrMsg = mBufferedReader.readLine())!= null) {
    					if (mStrMsg.trim().equals("exit")){
    						//退出 
    						mClientSockets.remove(mSocket) ; //O(logN)
    						mBufferedReader.close() ;
    						mPrintWriter.close() ; //output stream 
    						mStrMsg= "user:"+this.mSocket.getInetAddress()+"exit total:"+ mClientSockets.size() ;
    						mSocket.close() ;
    						sendMsg() ;
    						break ;
    					}else {
    						mStrMsg = mSocket.getInetAddress()+":"+ mStrMsg;
    						sendMsg() ;
    					}
    				}
    			} catch (Exception e) {
    				e.printStackTrace() ;
    			}
    		}
    		
    	}
    }
    

     安卓客户端

    package com.example.tcptest;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    
    import android.support.v7.app.ActionBarActivity;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    
    
    public class MainActivity extends ActionBarActivity {
    	private Button mInBtn , mSendBtn ;
    	private EditText mEditText1, mEditText2;
    	private static final String SERVERIP ="59.66.116.249" ;
    	private static final int SERVERPORT=8888;
    	private Thread mThread ;
    	private Socket mSocket ;
    	private BufferedReader mBufferedReader ;
    	private PrintWriter mPrintWriter ;
    	private String mStrMsg ="";
    	private static String TAG =MainActivity.class.getSimpleName() ;
    	
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            mInBtn = (Button)findViewById(R.id.myinternet_tcpclient_BtnIn) ;
            mSendBtn = (Button)findViewById(R.id.myinternet_tcpclient_BtnSend);
            mEditText1 = (EditText)findViewById(R.id.myinternet_tcpclient_EditText01);
            mEditText2 = (EditText)findViewById(R.id.myinternet_tcpclient_EditText02);
            
            mThread = new Thread(mRunnable) ;
           
            //登陆
            mInBtn.setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				try {
    					//实例化socket,连接服务器
    					mSocket = new Socket(SERVERIP, SERVERPORT);
    					//得到socket输入输出流
    					mBufferedReader = new BufferedReader(
    							new InputStreamReader(mSocket.getInputStream())) ;
    					mPrintWriter = new PrintWriter(mSocket.getOutputStream()) ;
    					 mThread.start();
    				} catch (Exception e) {
    					Log.i(TAG, "socket connect exception:"+ e.getMessage());
    					e.printStackTrace();
    				}
    				
    			}
    		}) ;
            mSendBtn.setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				try {
    					String str = mEditText2.getText().toString().trim();
    					//发送给服务器
    					mPrintWriter.print(str) ;
    					mPrintWriter.flush() ;
    				} catch (Exception e) {
    					// TODO: handle exception
    				}
    			}
    		}) ;
        }
        //监听服务器发来的消息
        private Runnable mRunnable = new Runnable() {
    		
    		@Override
    		public void run() {
    			while (true) {
    				try {
    					if ((mStrMsg =mBufferedReader.readLine())!=null ){
    						mStrMsg +="
    ";//换行
    						mHandler.sendMessage(mHandler.obtainMessage()) ;
    					}
    				} catch (Exception e) {
    					// TODO: handle exception
    				}
    			}
    		}
    	};
    	//更新用户界面 
    	Handler mHandler = new Handler(){
    
    		@Override
    		public void handleMessage(Message msg) {
    			super.handleMessage(msg);
    			mEditText1.append(mStrMsg) ;
    		}
    		
    	} ;
    	
    	
    }
    

    PC客户端

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    
    public class TcpClient {
    	private static final int PORT =8888;
    	private static ExecutorService executorService = Executors.newCachedThreadPool();
    	
    	public static void main(String args []){
    		new TcpClient() ;
    	}
    	public TcpClient(){
    		try {
    			Socket socket = new Socket("",PORT) ;
    			executorService.execute(new ThreadClient(socket)) ;
    
    		} catch (Exception e) {
    			// TODO: handle exception
    		}
    	}
    	static class ThreadClient implements Runnable{
    		private Socket socket ;
    		
    		public ThreadClient(Socket socket){
    			this.socket = socket ;
    		}
    		public void run() {
    			try {
    				BufferedReader br = new BufferedReader(
    						new InputStreamReader(socket.getInputStream())) ;
    				PrintWriter pw = new PrintWriter(socket.getOutputStream(), true) ;
    				String msg ="" ;
    				while (true) {
    					msg = br.readLine() ;
    					pw.println(msg) ;
    					if (msg.trim().equals("exit")){
    						pw.close() ;
    						br.close() ;
    						socket.close() ;
    						executorService.shutdownNow() ;
    					}
    				}
    			} catch (Exception e) {
    				e.printStackTrace(); 
    			}
    		}
    		
    	}
    }
    

      

      

  • 相关阅读:
    如何快速取得股票交易历史数据
    ArcSDE性能优化系列之ArcSDE参数篇
    2020年8月29日
    2020年8月31日
    9.2
    2020年8月25日
    2020年8月30日
    2020年8月27日
    2020年8月26日
    2020年8月28日
  • 原文地址:https://www.cnblogs.com/chuiyuan/p/4518579.html
Copyright © 2011-2022 走看看