版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/WQFAE01/article/details/78875729
在所有的通信中,网络通信是用到的比较多的一种,这一节我们主要是在广州微嵌安卓工业平板上学习是如何进行Tcp通信的。Tcp通信主要分为以下几个部分:建立服务器监听客户端的连接请求、建立客户端向服务器发送连接请求、服务器跟客户端建立连接后双方进行通信。
1、在安卓系统上使用网络需添加相应的权限:
<uses-permission android:name="android.permission.INTERNET" />
2、获取本机的IP地址:
//获取本机IP
public static String getIpAddressString() {
try {
for (Enumeration<NetworkInterface> enNetI = NetworkInterface
.getNetworkInterfaces(); enNetI.hasMoreElements(); ) {
NetworkInterface netI = enNetI.nextElement();
for (Enumeration<InetAddress> enumIpAddr = netI
.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (inetAddress instanceof Inet4Address && !inetAddress.isLoopbackAddress()) {
return inetAddress.getHostAddress();
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
return "";
}
3、服务器:
//新建服务器,绑定IP跟端口
ServerSocket server = new ServerSocket(port);
//创建好服务器开启监听客户端连接的线程
accept_thread = new accept_client();
accept_flag= true;
accept_thread.start();
监听客户端发来的连接请求线程:
private class accept_client extends Thread
{
@Override
public void run() {
// TODO 自动生成的方法存根
try {
while (!isInterrupted())
{
if(server.isClosed()){
return;
}
//server.accept()用于监听客户端发来的请求,该方法是阻塞等待直到有客户端连接
//返回值是一个用于跟客户端通信的Socket实例
c_Socket = server.accept();
//获取连接的客户端的IP跟端口号
InetAddress address = c_Socket.getInetAddress();
String c_point = String.valueOf(c_Socket.getPort());
//在有客户端连接后,启动线程接收客户端发来的数据
new ReadThread().start();
}
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
super.run();
}
}
服务器用于不断地接收客户端发来的数据的线程:
public class ReadThread extends Thread{
@Override
public void run() {
ArrayList removeItem = new ArrayList();
if(c_Socket!=null){
//获取c_Socket的InputStream流,用于读取数据
InputStream in = c_Socket.getInputStream();
}
byte[] buff = new byte[100];
while (!isInterrupted())
{
try{
int cnt = in.read(buff);
if (cnt >0) {
Log.d("ReceiveData",new String(buff,0,cnt);
}
}catch(Exception e) {
}
super.run();
}
}
服务器向客户端发送数据:
//获取c_Socket的OutputStream流,写入数据发送给客户端
try {
OutputStream out = c_Socket.getOutputStream();
//写入数据发送
out.write(data.getBytes());
out.flush();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
//关闭服务器:
server.close();
//关闭Socket:
c_Socket.close();
4、客户端:创建Socket实例,向服务器发送连接请求
private class connectToServer extends Thread{
@Override
public void run() {
try
{ /*客户端向服务器发送连接请求
*ip:服务器的IP地址
*port:服务器创建时绑定监听的端口号
*/
Socket mSocket = new Socket(ip,port);
}catch(Exception ee)
{
ee.printStackTrace();
return;
}
//判断是否连接成功
if (mSocket.isConnected())
{
//获取客户端的连接服务器所使用的端口号
int port = mSocket.getLocalPort();
//启动接收线程读取服务器发来的数据,服务器跟客户端接收数据的线程除了使用的Socket实例不一样外,其它的操作都相同
new ReadThread().start();
}
super.run();
}
}
客户端向服务器发送数据:
//获取mSocket的OutputStream流,写入数据发送给客户端
try {
OutputStream out = mSocket.getOutputStream();
//写入数据发送
out.write(data.getBytes());
out.flush();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
关闭客户端:
mSocket.close();
至此在安卓系统上是使用Tcp通信的最基本的功能就以实现,上述中的服务器可以监听多个客户端的连接请求,并可同时跟多个客户端通信。
扫描二维码关注公众号,回复:
5031772 查看本文章