Android 建立Socket客户端接受服务端发送的数据
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Thread(){ @Override public void run() { super.run(); try { // 创建Socket对象,指定服务器的IP地址和端口号 Socket socket = new Socket("自己的IP", 端口号); // 获取输入流,用于接收服务器发送的消息 InputStream is = socket.getInputStream(); while (true){ byte []b =new byte[1024];//采用byte数组 按字节进行数据的接收 避免readline()方法的阻塞机制!! 弊端是接受字节长度受限,但是在这个项目中足够了 int x= is.read(b, 0, b.length);//相较于readline()读取数据 字节读取慢 不适合大量数据的通信 if (x!=-1){ String string=new String(b, 0, x); Log.d("onmessage", "run: "+string); }else{ Log.d("onmessage", "run: "+x); } } } catch (IOException e) { e.printStackTrace(); } } }.start(); } }
?获取数据时候我使用的是inputStream.read,读取效率没有readLine()高,readLine()使用时候需要分隔符,不然会发生阻塞的情况,无法获取到准确的数据,自己按需使用
下面附带后端代码
public static void main(String[] args) throws IOException, InterruptedException { ServerSocket server = new ServerSocket(8081); while (true) { Socket socket = server.accept(); // 发送数据 System.out.println("成功连接"); OutputStream outputStream = socket.getOutputStream(); String message = "Hello, server!"; outputStream.write(message.getBytes()); outputStream.write(s.getBytes()); // 休眠一段时间,以模拟长连接 Thread.sleep(1000); } }
使用ServerSocket作为服务端,传入自己的端口号模拟长链接,当有客户端链接后,会在控制台输出连接成功字样,并发送"Hello,server!"的字样
到此一个简单的链接就完成了,后续可以自己封装成对应的方法类或增加接口更改自己的业务逻辑