一起Talk Android吧(第三百二十三回:Android中网络通信之TCP通信演示)

Posted talk_8

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一起Talk Android吧(第三百二十三回:Android中网络通信之TCP通信演示)相关的知识,希望对你有一定的参考价值。

各位看官们,大家好,上一回中咱们说的是android中网络通信之TCP客户端的例子,这一回中咱们说的例子是网络通信之TCP通信演示。闲话休提,言归正转。让我们一起Talk Android吧!

我们在前面章回中介绍了TCP通信的流程以及TCP服务端和客户端的接口,本章回中将介绍如何在通信过程中使用这些接口。

服务端演示

我们先定义T8Server1类,并且定义该类的构造方法,构造方法中包含一个参数表示服务器的端口,通过构造方法可以创建一个服务器对象。

我们在类中定义了acceptConnectRequest()方法,该方法封装了accept()方法,主要用来接受客户端发起的连接请求并且与客户端建立连接。

我们在类中定义了disconnectClient()方法,该方法封装了close()方法,主要用来断开服务端和客户端之间的TCP连接。

我们在类中定义传输数据的方法sendDataToClient()和getDataFromClient(),这两个方法使用了IO流来发送和接收数据,发送和接收数据时使用了字节流和字符流两种不同的方法,因此部分代码有注释,其中的细节我们就不详细了,大家可以参考下面的代码:

T8Server1.java
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.ServerSocket;
import java.net.SocketAddress;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.BufferedReader;
import java.io.PrintStream;

public class T8Server1 
    private Socket mSocket;
    private ServerSocket mServerSocket;
    private int mPort;
    private InputStream mSocketInputStream;
    private OutputStream mSocketOutputStream;

    public T8Server1 (int port) 
    	mPort = port;
    	try 
    		mServerSocket = new ServerSocket(mPort);
    	catch(Exception e) 
        	e.printStackTrace();
    	
    

    public void acceptConnectRequest() 
    	if(mServerSocket != null) 
    		try 
    			mSocket = mServerSocket.accept();
    			System.out.println("Server accept the request of Client");
    		catch(Exception e) 
    	    	e.printStackTrace();
    		
    	
    

    public void disconnectClient() 
    	if(mServerSocket!= null && !mServerSocket.isClosed()) 
    		try 
    			if(mSocketInputStream != null)
    				mSocketInputStream.close();

    			if(mSocketOutputStream != null)
    				mSocketOutputStream.close();

                mServerSocket.close();
    		catch (IOException e) 
    			e.printStackTrace();
    		
    	
    

    public void sendDataToClient(String data) 
    	PrintStream printStream = null;
    	try 
    		if(mSocketOutputStream == null) 
    			mSocketOutputStream = mSocket.getOutputStream();
    		

    		if(printStream == null) 
    			printStream = new PrintStream(mSocketOutputStream);
    		

    		printStream.println(data);
    		// mSocketOutputStream.write(data.getBytes());
    		// mSocketOutputStream.flush();

    	catch (IOException e) 
    			e.printStackTrace();
    	
    

     public String getDataFromClient() 
     	String data = null;
     	BufferedReader bufferedReader = null;
     	StringBuilder strTemp = new StringBuilder();
     	byte [] bytes = new byte[1024];
        char [] charByte = new char[512];

    	try 
    		if(mSocketInputStream == null) 
    			mSocketInputStream = mSocket.getInputStream();
    		

            //get data by byte stream
            // new InputStreamReader(mSocketInputStream).read(charByte);
            // data = String.valueOf(charByte);
            //get data by character stream
    		if(bufferedReader == null) 
    			bufferedReader = new BufferedReader(new InputStreamReader(mSocketInputStream));
    		

    		data = bufferedReader.readLine();
    	catch (IOException e) 
    			e.printStackTrace();
    	

    	return data;
    

客户端演示

我们先定义T8Client1类,并且定义该类的构造方法,构造方法中包含两个参数,分别表示服务器的IP地址和端口,通过构造方法可以创建一个客户端对象。

我们在类中定义了connectServer()方法,该方法封装了connect()方法,主要用来向服务端发起连接请求。

我们在类中定义了disconnectServer()方法,该方法封装了close()方法,主要用来断开服务端和客户端之间的TCP连接。

我们在类中定义传输数据的方法sendDataToServer()和getDataFromSever(),这两个方法使用了IO流来发送和接收数据,发送和接收数据时使用了字节流和字符流两种不同的方法,因此部分代码有注释,其中的细节我们就不详细了,大家可以参考下面的代码:

T8Client1.java

import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.BufferedReader;
import java.io.PrintStream;

public class T8Client1 
    private String strAddress;
    private Socket mSocket;
    private String mHost;
    private int mPort;
    private InetAddress remoteAddr;
    private SocketAddress mSocketAddress;
    private InputStream mSocketInputStream;
    private OutputStream mSocketOutputStream;

    public T8Client1 (String addr, int port) 
    	try 
    		strAddress = addr;
    		mPort = port;
            remoteAddr = InetAddress.getByName(strAddress);
            mSocketAddress = new InetSocketAddress(remoteAddr,mPort);
            mSocketOutputStream = null;
            mSocketInputStream = null;
         catch(Exception e) 
        	e.printStackTrace();
        

        try 
        	mSocket = new Socket();
        catch(Exception e) 
        	e.printStackTrace();
        
    

    public void connectServer() 
    	int timeOut = 5000;
    	try 
    		mSocket.connect(mSocketAddress,timeOut);
    		System.out.println("Client connect to Server successfully");
    	catch (Exception e) 
    		e.printStackTrace();
    	
    

    public void disconnectServer() 
    	if(mSocket != null && mSocket.isConnected()) 
    		try 
    			if(mSocketInputStream != null)
    				mSocketInputStream.close();

    			if(mSocketOutputStream != null)
    				mSocketOutputStream.close();

        		mSocket.close();
    		catch (IOException e) 
    			e.printStackTrace();
    		
    	
    

    public void sendDataToServer(String data) 
    	PrintStream printStream = null;
    	try 
    		if(mSocketOutputStream == null) 
    			mSocketOutputStream = mSocket.getOutputStream();
    		

    		if(printStream == null) 
    			printStream = new PrintStream(mSocketOutputStream);
    		

    		// printStream.println(data);
    		mSocketOutputStream.write(data.getBytes());
    		// mSocketOutputStream.flush();

    	catch (IOException e) 
    			e.printStackTrace();
    	
    

     public String getDataFromSever() 
     	String data = null;
     	BufferedReader bufferedReader = null;
     	StringBuilder strTemp = new StringBuilder();
     	byte [] bytes = new byte[512];

    	try 
    		if(mSocketInputStream == null) 
    			mSocketInputStream = mSocket.getInputStream();
    		

    		mSocketInputStream.read(bytes);
    		if(bufferedReader == null) 
    			bufferedReader = new BufferedReader(new InputStreamReader(mSocketInputStream));
    		

    		data = bufferedReader.readLine();
    	catch (IOException e) 
    			e.printStackTrace();
    	

    	// for(byte item : bytes) 
    	// 	strTemp.append(String.format("%s", item));
    	// 

    	// data = strTemp.toString();

    	return data;
    
    

TCP通信演示

我们创建一个包含main方法的类,用它来当作控制TCP通信的主程序。在main方法中先创建服务端和客户端对象。因为TCP通信过程中会阻塞主线程,也就是main方法所在的线程,所以我们创建了两个子线程,分别表示服务端和客户端。

在服务端线程中主要是监听客户端发来的连接请求,在接受连接请求后接收客户端发来的数据,数据接收完成后关闭TCP连接。

在客户端线程中主要向服务端发起连接请求,在连接建立成功后向服务端发送数据:“This is the Client”,数据发送完成后关闭TCP连接。

接着在主线程中启动服务端和客户端的线程,注意需要先启动服务端线程。下面是该类的代码,请大家参考:

TCPEx1.java

public class TCPEx1 

	public static void main(String args[]) 
		String serverAddress = "127.0.0.1";
		int serverPort = 8009;
		T8Server1 mServer;
		T8Client1 mClient;


		Thread mServerThread;
		Thread mClientThread;

		mServer = new T8Server1(serverPort);
		mServerThread = new Thread( new Runnable() 
			@Override
            public void run() 
            	boolean flag = true;
            	String data = "null";

				while(flag) 
					System.out.println("---> server waiting  request of client...");
					if(mServer != null) 
						mServer.acceptConnectRequest();

					data = mServer.getDataFromClient();
					System.out.println("---> Server get data < "+data+" > form Client.");

					if(data != null)
						flag = false;
				

				mServer.disconnectClient();
            
		);

		mServerThread.start();



		mClient = new T8Client1(serverAddress,serverPort);
		mClientThread = new Thread( new Runnable() 
			@Override
	        public void run() 
			String data = "This is the Client";

				if(mClient != null) 
					mClient.connectServer();

					System.out.println("<-- Client send data < "+data+ " > to server.");
					mClient.sendDataToServer(data);

					mClient.disconnectServer();
				
			
		);

		mClientThread.start();
	


在控制台中编译并且运行这三个类,可以得到以下结果:

$ javac T8Client1.java T8Server1.java TCPEx1.java
$ java TCPEx1
---> server waiting  request of client...
Client connect to Server successfully
Server accept the request of Client
<-- Client send data < This is the Client > to server.
---> Server get data < This is the Client > form Client.

看官们,关于Android中网络通信之TCP通信演示的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

以上是关于一起Talk Android吧(第三百二十三回:Android中网络通信之TCP通信演示)的主要内容,如果未能解决你的问题,请参考以下文章

一起Talk Android吧(第三百二十六回:Android中的布局编辑器)

一起Talk Android吧(第三百八十三回:视图绑定-ViewBinding)

一起Talk Android吧(第三百四十三回: Android网络编程总结)

一起Talk Android吧(第三百一十三回:ImageView常用属性二)

一起Talk Android吧(第三百二十五回:Android中网络通信之TCP通信模型二)

一起Talk Android吧(第三百七十三回:多线程版Timer)