android之Socket编程

一、计算机分为硬件和软件
计算机硬件,分为5大类
1.输入设备
2.输出设备
3.存储器
4.运算器
5.控制器
二、软件充分利用计算机的硬件性能特性
比如输入输出设备,就是我们的数据输入输出
存储器就是临时存储数据或者持续存储数据
最后是运算器和控制器集成为中央处理器也就是我们的cpu
先有数据才有数据处理
三、所以我们开始学习的是二大数据类型。
1.基本数据类型(4类5种)
2.引用数据类型
要记住java是强类型的语言,对每一种数据都定义了具体数据类型,在内存中分配了不同大小的内存空间,所以在内存中的
我们都程序要对数据处理首先要在数据中定义数据,也就是数据类型,我们的程序运行在内存空间,也就是数据存储在内存中
四、我们觉得处理一个数据太慢了
所以我们引用了数组,处理一组类型相同的数组
五、又学到引用类型数据,类对象
成员变量是数据
而成员方法就是操作数据
六、数据流动
 计算机网络
是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,
  在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
网络编程
就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。
七、网络编程三要素
1.ip要素
每个设备在网络中的唯一标识
每台网络终端在网络中都有一个独立的地址,我们在网络中传输数据就是使用这个地址。 
2.端口号要素
每个程序在设备上的唯一标识
每个网络程序都需要绑定一个端口号,传输数据的时候除了确定发到哪台机器上,还要明确发到哪个程序。
端口号范围从0-65535
编写网络应用就需要绑定一个端口号,尽量使用1024以上的,1024以下的基本上都被系统程序占用了。
3.协议要素
为计算机网络中进行数据交换而建立的规则、标准或约定的集合。
UDP
面向无连接,数据不安全,速度快。不区分客户端与服务端。
TCP
 面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。
三次握手: 客户端先向服务端发起请求, 服务端响应请求, 传输数据
八、Socket套接字概述
Socket翻译过来是插座的意思,插座中间需要电线连接,电流通过电线传输
我们的数据在网络上的传输也是再电线上传输的,是端对端传输,两个插座相当于两个端口一样(它还包裹了ip),
 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
通信的两端都有Socket。
 网络通信其实就是Socket间的通信。
 数据在两个Socket间通过IO流传输。(它只是增加了绑定机制与驱动程序建立关系)
Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和port。
绑定机制就是绑定网络驱动,Socket程序让底层网络驱动程序运行,底层网络驱动程序调用ip和port之间进行传输
Socket在android中其实屏蔽了下层网络之间的传输,向上提供了拥有网络输出的能力,也就是我们的运输层(船),数据(货物)通过socket进行传输
Socket有种传输方式,有连接的TCP(三次),无连接的UDP(一次)
九、UDP传输
发送端:
String str = "what are you 弄啥呢?";
//创建Socket绑定计算机本地网络端口驱动
DatagramSocket socket = new DatagramSocket();
DatagramPacket packet = //创建数据包Packet用来在网络中传输的,也就是创建集装箱
new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);//数据包包含什么呢,数据!要有形式和大小,字节流,字节的长度,它是在网络中传输的,所以要有数据,然后有网络抵达(对方的ip和端口)
//通过本机网络端口驱动发数据包到网络中
socket.send(packet);
//断开Socket与本地计算机端口的驱动,释放资源
socket.close();
接收端:
//创建Socket绑定计算机本地网络端口驱动
DatagramSocket socket = new DatagramSocket(6666);
//创建数据包Packet用来接收网络中传输的,这个数据的大小,注意数据是通过字节的形式传输的
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
//本地中数据包接收到网络端的数据包
socket.receive(packet);
//把(packet)数据包中的数据拿到程序中,(程序获取数据,本段代码是在本机的一段程序中,所以自己知道自己的端口,ip不需要了,程序直接拿过去)
接收方获取ip和端口号
String ip = packet.getAddress().getHostAddress();
int port = packet.getPort();
byte[] arr = packet.getData();
//获取有效的字节个数,发过来的数据有很多定义格式的数据,很多无用的数据,它是经过网络的加载的,相当于加了一些数据,那些数据是什么,这需要网络编程的知识,总之就是识别网路,优化传输的,使它更加快捷的传输,所以要解码。
 //从获取数据包中有效数据的长度
int len = packet.getLength();
//输出控制台
System.out.println(new String(arr,0,len));
//解除绑定,释放资源
socket.close();
十、TCP传输
相当于客服端和服务器建立连接,客服端与服务器开辟一条数据路,也只能开辟一条路,固定的路子
也就是程序的端口与程序的端口建立链接,端对端,。所以用到Socket,Socket就是端口了这会以流,管子的形式连接的
客户端:调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
服务端:调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流

客户端:
Socket socket = new Socket("127.0.0.1", 9999); //创建Socket指定ip地址和端口号
InputStream is = socket.getInputStream(); //获取服务器的输入流,数据过来,其中要先三次握手才能传输数据,输入的管子口子
OutputStream os = socket.getOutputStream(); //获取服务器的输出流,输出的管子口子
BufferedReader br = new BufferedReader(new InputStreamReader(is)); //中间有一端临时的管子,
PrintStream ps = new PrintStream(os);
System.out.println(br.readLine());
ps.println("我想报名学习");
System.out.println(br.readLine());
ps.println("爷不学了");
socket.close();

服务器:
ServerSocket server = new ServerSocket(9999); //创建服务器的端口一直监听这个端口,有无数据
Socket socket = server.accept(); //接受客户端的请求时,要阻塞,等处理了这个数据,再开通
new Thread() {
public void run() { //服务端是多线程的
try {
InputStream is = socket.getInputStream(); //获取客户端输入流,开管子,获取数据,
OutputStream os = socket.getOutputStream(); //获取客户端输出流,开管子,发数据用的
BufferedReader br = new BufferedReader(new InputStreamReader(is)); //通过字符缓冲输入流获取数据字符,内存拿到网络的数据,进行处理
PrintStream ps = new PrintStream(os); //通过打印流输出数据,打印流就是下面打印的数据
ps.println("好啊,我这就发给你,发你之前我要确定一下你还在吗,我准备发了");
System.out.println(br.readLine());
ps.println("接到了客户端确认的信息,发送数据过来中...");
System.out.println(br.readLine()); //直接输出
socket.close();
//server.close(); //关闭服务端,但是一般不用关,一直开着接收数据
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();






















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值