Android上实现TCP服务端

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android上实现TCP服务端相关的知识,希望对你有一定的参考价值。

参考技术A 之前已经讲过了tcp客户端的实现了,大家有兴趣的话,可以参看文章
android上实现TCP客户端
那么,今天我们就来讲讲tcp之服务端的封装吧。我已经将tcp服务端封装成了一个类—TcpServer,下面就来讲讲它的使用吧。

今天涉及内容:

先来波效果图

在 tcp服务端 建立 ServerSocket 的时候,我们通常是这样的:

其实以上方法调用的是

其中涉及到的参数:

鉴于tcp服务端 ServerSocket 一般运行在 "本机" 上,则快速初始化 ServerSocket 运用上面的方法:

意思是建立的ServerSocket IP地址为本机,可容纳socket个数为 50 。

在理解了 ServerSocket 初始化问题后,让我们来看看封装类TcpServer的几个主要方法:

TcpServer 主要是在 java 上运行,所以就让我们在 Androidstudio 上模拟下在 Java 中运行tcp服务端的场景:

这里涉及到的两个类 SocketConfig 和 SocketHelper 和之前的一样,大家可以参考文章 Android上实现TCP客户端 中与之相关的介绍,这里就不赘述了。

tcp服务端主要容易出现以下两个问题:

对于第一个问题,这里需要强调的是 TcpServer 的接收方法 receiveMessage(String charsetName) 是以 (result = bufferedReader.readLine()) != null 做判断读取 stream 的,所以客户端向 TcpServer 发送消息时,需要在结尾加上\n,这样 TcpServer 的receiveMessage(String charsetName)方法才能将传过来的数据接收完整。
对于第二个问题,则需要客户端与服务端设置相同的字符集以保证数据不乱码。

封装类 TcpServer 源码如下:

(4)优化TCP编写 客服端上传图片,服务端给客服端发消息问好

(4)优化TCP编写 客服端上传图片,服务端给客服端发消息问好

此demo的在上一个的基础上实现客服端与服务器端互相发送消息给对方,提高数据的读与取的效率,首先要先启动服务端,否则报错,因为TCP是可靠协议,所以没有对应的服务端时会报错,发送数据为图片

一.编写TCP协议服务端

 1   package demo.soket.tcp;
 2   ?
 3   import java.io.BufferedInputStream;
 4   import java.io.BufferedOutputStream;
 5   import java.io.FileOutputStream;
 6   import java.io.IOException;
 7   import java.io.OutputStream;
 8   import java.net.ServerSocket;
 9   import java.net.Socket;
10   ?
11   //TCP协议服务端
12   public class Server {
13       public static void main(String[] args) {
14           /**
15            * 1.创建服务端ServerSocket对象
16            * 2.监听socket连接
17            * 3.通过返回的socket对象来获取io流里面的数据
18            * 4.打印数据
19            */
20           //1.
21           ServerSocket server=null;
22           try {
23               server=new ServerSocket(12345);
24               //2.
25               Socket client=server.accept();
26               //3.
27               //字节缓冲输入流,效率高
28               BufferedInputStream bis=new BufferedInputStream(client.getInputStream());
29               System.out.println("bis"+bis);
30               
31               //给客服端发消息
32               OutputStream out=client.getOutputStream();
33               String result="欢迎你的到来:"+client.getLocalAddress();
34               out.write(result.getBytes());
35               
36               //接收客服端胡消息
37               BufferedOutputStream os=new BufferedOutputStream(new FileOutputStream("客户端发过来的图片.jpg"));
38               byte[] b=new byte[1024];
39               int len=0;
40               while((len=bis.read(b))!=-1) {
41                   os.write(b, 0, len);
42                   os.flush();//刷出缓冲流中的数据,关闭连接前一定要刷,否则会数据缺失
43               }
44               //缓冲流
45               os.close();
46               client.close();
47               bis.close();
48               server.close();
49           } catch (IOException e) {
50               e.printStackTrace();
51           }
52       }
53   }

 


?

二.编写TCP协议客服端

 1  package demo.soket.tcp;
 2   ?
 3   import java.io.BufferedInputStream;
 4   import java.io.BufferedOutputStream;
 5   import java.io.FileInputStream;
 6   import java.io.IOException;
 7   import java.io.InputStream;
 8   import java.net.Socket;
 9   import java.net.UnknownHostException;
10   ?
11   /**
12    * TCP特点:
13    * 1.建立连接,形成传输数据的通道
14    * 2.在链接中进行大量数据传输
15    * 3.通过三次握完成连接,是可靠协议,所以没有对应的服务端时会报错
16    * 4.必建立连接,效率会稍低些
17    * @author Administrator
18    *
19    */
20   public class Client {
21       public static void main(String[] args) {
22           /**
23            * 1.创建一个客服端的socket对象
24            * 2.建立连接
25            * 3.通过io流在管道里面传输数据
26            * 写数据:输出流 getOutputStream() 
27            * 接收数据:输入流 getInputStream() 
28            * 4.关闭socket
29            */
30           //1.|2.
31           Socket client=null;
32           try {
33               client=new Socket("192.168.95.2",12345);
34               //3.
35               BufferedOutputStream os=new BufferedOutputStream(client.getOutputStream());
36               String path="C:\\Users\\Administrator\\Pictures\\微信图片_20200629170031.jpg";
37               BufferedInputStream buf=new BufferedInputStream(new FileInputStream(path));
38               byte[] b=new byte[1024];
39               int len=0;
40               while((len=buf.read(b))!=-1) {
41                   os.write(b, 0, len);
42                   os.flush();//关闭连接前一定要刷,否则会数据缺失
43               }
44               
45               //获取服务端发过来的消息
46               InputStream in=client.getInputStream();
47               byte[] bi=new byte[1024];
48               int leng=0;
49               while((leng=in.read(bi))!=-1) {
50                   System.out.println("收到服务器通知:"+new String(bi,0,leng));
51               }
52               //关闭读文件操作
53               buf.close();
54               os.close();
55           } catch (UnknownHostException e) {
56               e.printStackTrace();
57           } catch (IOException e) {
58               e.printStackTrace();
59           }finally {
60               //4.
61               if(client!=null) {
62                   try {
63                       client.close();
64                   } catch (IOException e) {
65                       e.printStackTrace();
66                   }
67               }
68           }
69       }
70   }

 


?

 

三 .demo运行

刷新项目后会多一张上传的图片

技术图片

 

以上是关于Android上实现TCP服务端的主要内容,如果未能解决你的问题,请参考以下文章

乐鑫Esp32学习之旅⑨ esp32上实现本地 TCP 客户端和服务端角色,可断线重连原路返回数据。(附带Demo)

(4)优化TCP编写 客服端上传图片,服务端给客服端发消息问好

在基于 Spring MVC 的服务器上实现 WebSocket

如何在客户端上建立一个Socket与服务器端连接,包括连接的函数?

FTP主动模式和被动模式在VRP上实现(实验报文和理论解析)

如何使用 Node 服务器验证 Android Google 登录