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

本文详细介绍了Android中TCP网络通信的实现,包括服务器端(T8Server1)和客户端(T8Client1)的创建、连接、数据传输及断开连接的步骤。通过示例代码展示了如何使用IO流进行字节流和字符流的数据收发,以及在主线程中启动服务端和客户端线程进行通信的过程。
摘要由CSDN通过智能技术生成

各位看官们,大家好,上一回中咱们说的是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通信演示的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值