------- android培训、java培训、期待与您交流! ----------
网络编程:(Socket编程、套接字编程)
网络编程三要素:
1、IP地址
2、端口:应用程序的逻辑标识(范围:0~65535;有效范围:1024~65535)
3、协议
应用程序的规则:
UDP:
面向无连接
打包发送数据,大小有限制,64K
不可靠,速度快
TCP:
面向有连接
数据无限制
可靠,速度慢
Socket:
网络编程其实是Socket间的通信,数据在Socket的IO间进行传输。
UDP编程:
只要是网络传输,必须有socket 。
数据一定要封装到数据包中,数据包中包括目的地址、端口、数据等信息。
直接操作udp不可能,对于java语言应该将udp封装成对象,易于我们的使用,这个对象就是DatagramSocket. 封装了udp传输协议的socket对象。
因为数据包中包含的信息较多,为了操作这些信息方便,也一样会将其封装成对象。这个数据包对象就是:DatagramPacket.通过这个对象中的方法,就可以获取到数据包中的各种信息。
DatagramSocket具备发送和接受功能,在进行udp传输时,需要明确一个是发送端,一个是接收端。
UDP的发送端思路:
代码体现:
//创建发送端的Socket服务对象。DatagramSocket
DatagramSocket ds = new DatagramSocket();
//封装数据 byte[] bys = "".getBytes()
byte[] bys = "hello,udp".getBytes();
//打包数据 DatagramPacket
DatagramPacket dp = new DatagramPacket(bys,bys.length,InetAddress.getByName("192.168.1.100"),11111);
//发送数据
ds.send(dp);
//释放资源
ds.close();
UDP的接收端思路:
代码体现:
//创建接收端的Socket服务对象,指定端口。DatagramSocket
DatagramSocket ds = new DatagramSocket(11111);
//创建容器对象
byte[] bys = new byte[1024];
//创建数据包对象
DatagramPacket dp = new DatagramPacket(bys,bys.length);
//接收数据
ds.receive(dp);
//解析数据
String ip = dp.getInetAddress().getHostAddress();
String text = new String(dp.getData(),0,dp.getLength());
//释放资源
ds.close();
案例:
1:键盘录入数据,发送
2:聊天程序
3:多线程改进聊天程序
TCP编程:
两个端点的建立连接后会有一个传输数据的通道,这通道称为流,而且是建立在网络基础上的流,称之为socket流。该流中既有读取,也有写入。
tcp的两个端点:一个是客户端,一个是服务端。
客户端:对应的对象,Socket
服务端:对应的对象,ServerSocket
TCP客户端发送思路:
代码体现:
//创建客户端的服务对象,指定目标和端口。Socket
Socket s = new Socket(InetAddress.getByName("192.168.1.100"),10086);
//创建数据
OutputStream os = s.getOutputStream();
//获取输出流对象
os.write("hello,tcp".getBytes());
//通过流对象输出数据
os.flush();
//释放资源
s.close()
TCP服务器端接收思路:
代码体现:
//创建服务器端的服务对象,并制定端口。ServerSocket
ServerSocket ss = new ServerSocket(10086);
//通过accept方法获取当前连接的客户端对象
Socket s = ss.accept();
//通过客户端对象获取输入流
InputStream is = s.getInputStream();
//读取数据并输出
byte[] bys = new byte[1024];
int len = is.read(bys);
String text = new String(bys,0,len);
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"***"+text);
//释放资源
ss.close();
案例:
1:服务器给客户端一个反馈
2:键盘录入数据,服务器大写反馈
注意事项:字符流要刷新,readLine方法是以\r\n作为结束。
3:上传文件
注意事项:容易产生阻塞。
4: 解决方案:
自定义结束标记
shutDownOutput(),shutDownInput()