一起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常用属性二)