TCP Socket Demo 总结

一、服务器端建立Socket监听

1、Class类里添加PORT定义 

  //add by cbl 3-9 Socket global variable
    private static final int PORT = 20001;  
    private List<Socket> mList = new ArrayList<Socket>();  
    private ServerSocket server = null;  
    private ExecutorService mExecutorService = null; //thread pool  

2、创建监听线程
   

 //监听线程
    class LooperThread extends Thread {      
    	public void run() {           
    			Looper.prepare();  
    			startSocket();
    			Looper.loop();       
    	}
    }
    
    public void startSocket() {  
 	try {  
            server = new ServerSocket(PORT);  
            mExecutorService = Executors.newCachedThreadPool();  //create a thread pool  
//            Log.v("SoftKeyboard____startSocket", "server start ...");


            Socket client = null;  
            while(true) {  
                client = server.accept();  
                mList.add(client);  
                mExecutorService.execute(new Service(client)); //start a new thread to handle the connection  
            }  
        }catch (Exception e) {  
            e.printStackTrace();  
        }  
    	
    }  
    //接收线程
    class Service implements Runnable {  
        private Socket socket;  
        private BufferedReader in = null;  
        private String msg = "";  
          
        public Service(Socket socket) {  
            this.socket = socket;  
            try {  
                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
                msg = "user" +this.socket.getInetAddress() + "come toal:"  
                    +mList.size();  
                this.sendmsg();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
              
        }  

        @Override  
        public void run() {  
            // TODO Auto-generated method stub  
            try {  
                while(true) {  
                    if((msg = in.readLine())!= null) {  
                        if(msg.equals("cblexit")) {
                        	//收到"cblexit"字符后,关闭socket
                            mList.remove(socket);  
                            in.close();  
                            msg = "user:" + socket.getInetAddress()  
                                + "exit total:" + mList.size();  
                            socket.close();  
                            返回给client:退出提示消息
                            this.sendmsg();  
                            break;  
                        } else {  
                        	  //返回给client:IP+server收到的消息
                              	  msg = socket.getInetAddress() + ":" + msg;  
                            	  this.sendmsg();
                        	
                        }  
                    }  
                }  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
        
       public void sendmsg() {  
           System.out.println(msg);  
           int num =mList.size();  
           for (int index = 0; index < num; index ++) {  
               Socket mSocket = mList.get(index);  
               PrintWriter pout = null;  
               try {  
                   pout = new PrintWriter(new BufferedWriter(  
                           new OutputStreamWriter(mSocket.getOutputStream())),true);  
                   pout.println(msg);  
               }catch (IOException e) {  
                   e.printStackTrace();  
               }  
           }  
       }  
    } 

3、开启线程实现监听,放在OnCreate函数中,或其他需要启动监听的入口

 //add by cbl 3-9 开启线程实现监听
 new LooperThread().start();

二、客户端实现TCP Socket发送

1、定义PORT和HOST

    private static final String HOST = "127.0.0.1";//"192.168.19.63";  
    private static final int PORT = 20001;  
    private Socket socket = null;  
    private BufferedReader in = null;  
    private PrintWriter out = null;  
    private String content = "";  

2、发送TCP 数据

 //send button:TCP client Send

        btn_send.setOnClickListener(new Button.OnClickListener() {  
  
            public void onClick(View v) {  
                // TODO Auto-generated method stub  
                String msg = ed_msg.getText().toString();  
                if (socket.isConnected()) {  
                    if (!socket.isOutputShutdown()) {  
                        out.println(msg);  
                    }  
                }  
            	
            }  
        });  
        
        //start button  --建立和Socker Server 的连接
         btn_start.setOnClickListener(new Button.OnClickListener() {  
            public void onClick(View v) {  
            	
                //以前用2.2 访问WebService没有问题,到3.0上访问出现android.os.NetworkOnMainThreadException
                //找了资料经过实践,解决方法是在activity类中的onCreate方法中添加strict代码,如下:
                StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()  
                .detectDiskReads().detectDiskWrites().detectNetwork() // or  
                .penaltyLog().build());  
                StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects()  
                .penaltyLog().penaltyDeath().build()); 
            	 try {  
            		 Log.v("client_new Socket", ".................new Socket(HOST, PORT)........");
                     	socket = new Socket(HOST, PORT);  
                     	in = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
                     	out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);  
            		 Log.v("client_after new Socket", "...............in  out  finished........");

                 } catch (IOException ex) {  
                     ex.printStackTrace();  
                     ShowDialog("login exception" + ex.getMessage());  
                 }  
            	 
            	 new Thread(SocketDemo.this).start();  
            }  
        });  
    }  
  
    public void ShowDialog(String msg) {  
        new AlertDialog.Builder(this).setTitle("notification").setMessage(msg)  
                .setPositiveButton("ok", new DialogInterface.OnClickListener() {  
                    public void onClick(DialogInterface dialog, int which) {  
                        // TODO Auto-generated method stub  
                    }  
                }).show();  
    }  
  
    public void run() {  
        try {  
            while (true) {  
                if (socket.isConnected()) {  
                    if (!socket.isInputShutdown()) {  
                        if ((content = in.readLine()) != null) {  
                            content += "\n";  
                            mHandler.sendMessage(mHandler.obtainMessage());  
                        } else {  
  
                        }  
                    }  
                }  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
  
    public Handler mHandler = new Handler() {  
        public void handleMessage(Message msg) {  
            super.handleMessage(msg);  
            tv_msg.setText(tv_msg.getText().toString() + content);  
        }  
    };
Manifest.xml 添加网络授权
 <uses-permission android:name="android.permission.INTERNET"/>     

参考:
http://gu6866.iteye.com/blog/1290358

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: TCP通信demo是指基于TCP协议实现的通信示例程序。TCP协议是一种可靠的、面向连接的传输层协议,它的主要特点是在通信双方建立连接后,可保证数据的完整性、有序性和可靠性,在数据传输过程中还可以进行流量控制和拥塞控制,因此在网络传输中得到广泛的应用。 在实现TCP通信demo的过程中,需要注意以下几个方面: 1.连接建立:在TCP协议中,连接的建立需要经过三次握手的过程,即发送SYN报文、收到SYN+ACK报文、发送ACK报文。因此,在demo中需要实现连接建立的过程,并保证建立成功后才能进行数据传输。 2.数据传输:在TCP协议中,数据是分段传输的,每个数据包都有一个序号和确认序号。因此,在demo中需要实现数据的分段传输和接收,并进行序号和确认序号的匹配。 3.流量控制和拥塞控制:在TCP协议中,为了避免网络拥塞导致数据传输的失败,需要进行流量控制和拥塞控制。在demo中可以实现简单的流量控制和拥塞控制,例如设置最大传输速度和传输窗口大小。 总之,TCP通信demo是一个重要的网络编程示例程序,它可以帮助我们了解TCP协议的工作原理和应用场景,提高我们的网络编程技能和调试能力。 ### 回答2: TCP通信是计算机网络中重要的传输层协议,用于在两个设备之间提供可靠的数据传输。编写一个TCP通信的demo是帮助理解TCP协议及其应用的一种方式。以下是一份简单的TCP通信demo的说明: 该demo包含两个客户端和一个服务器端。客户端向服务器发送数据,服务器接收数据并返回响应。客户端与服务器之间通过一个连接在TCP协议下进行通信。客户端通过套接字socket()函数创建一个套接字,并使用connect()函数连接到服务器。服务器端也使用socket()函数创建套接字,并调用bind()函数绑定端口号,然后使用listen()函数开启监听模式。当客户端连接到服务器后,服务器端使用accept()函数接受连接请求,然后使用recv()函数接收客户端发送的数据,并使用send()函数发送响应。客户端通过send()函数发送数据,并使用recv()函数接收服务器端的响应。 在编写TCP通信demo时需要注意以下事项: 1. 客户端和服务器端需使用相同的协议族(如IPv4或IPv6)和协议类型(如TCP或UDP)。 2. 确定通信过程中所需的数据格式,并在客户端和服务器端之间使用相同的格式传输数据。 3. 需要注意TCP协议中的粘包问题,即多个数据包可能会被合并在一起,需要使用固定长度或特殊分隔符来区分数据包。 4. 在处理网络异常情况时,应考虑超时、连接失效等问题,并进行相应的异常处理。 通过编写TCP通信demo,可以更加深入理解TCP协议的工作原理和应用,加强网络编程的基本功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值