------- android培训、java培训、期待与您交流! ----------
网络编程
抽象:网络实现计算机间,电子设备间数据的信息传递和资源共享;
模型:四层网络模型(应用层,传输层,网际层,数据链路层),在网络间传输的传输协议,1应用层的有Http,Https,Ftp等;2传输层tcp/udp;3网际层ip地址,通常我将端口号也加入到这个层来,以便忘记了;
概念:java对这种通信机制进行了封装,四要素:
Socket机制:
1)通信两端都应该有Socket对象
2)所有的通信都是通过Socket间的IO进行操作的
UDP协议:1)数据报包:DatagramSocket,DatagramPacket
2)特点:数据打包,传输数据有限制(64k),面向不连接,速度快,不可靠
TCP协议:1)连接通道:Socket,ServerSocket,通过三次握手机制,通常在创建对象时就已经连接好了,否则会连接不成功,报异常,通常简练Tcp连接也是比较费资源的。
2)特点:建立数据通道,传输数据无限制,速度低,可靠
Ip: 硬件的ID,就和身份证件一样:InetAddress
端口:其实每一个应用程序都有一个端口号(逻辑端口),只要是IO流相关的都有端口号,端口是应用程序在操作系统中注册的一个标识,用来给操作系统监听的。范围:0-65535。其中0-1024不建议使用,因为为系统占用的端口号;
原理:不管是Udp还是Tcp底层都的都是IO流来传递数据的,因为网络只是一个信息传递的介质
UDP两端步骤:老师比喻的非常形象,去邮局邮寄东西,但是注意异常处理
发送端:
1,建立UDPSocket服务;
2,创建数据报包,将数据封装到包中,主机,端口,数据,注意,作为发送端,发送的ip地址和对应的端口好必须定义在数据报包中;
3,通过Socket发送出数据报包
4,关闭资源
接收端:
1,建立UDPSocket服务,并监听端口;
2,定义数据报包对象,用于存储发送过来的数据,因为这个数据包提供了对数据的解析功能
3,通过socket的Receive()方法接收数据并存放到数据报包中
4,解析数据报
5,关闭资源;
注意:udp发送端和接收端,谁先启动没有影响,因为无连接;但是为了能看到效果,一般先启动服务端,因为socket的接收方法是阻塞式的;
Tcp两端步骤:
1因为tcp是面向连接的,所以先要建立连接,在两端形成通路以后在通道内交互数据;
2当创建好了对象之后,连接就完成了,只需要监听就可以了建立连接比较耗费资源,tcp为每一个客户端都建立一个socket连接对象,不冲突
代码练习:
1用UDP事项聊天小程序:
/**
* 聊天客户端
同时进行,要实现用多线程技术
*/
public class UdpChatClient implements Runnable {
DatagramSocket ds = null;
public UdpChatClient(DatagramSocket client) {
this.ds = client;
}
@Override
public void run() {
//封装键盘输入
BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));
String line = null;
try {
while ((line = sc.readLine()) != null && (!"".equals(line))) {
if (line.equals("晚了睡了")) {
break;
}
byte[] data = line.getBytes();
DatagramPacket dp = null;
try {
// 包装发送数据,写标签
dp = new DatagramPacket(data, 0, data.length,
InetAddress.getByName("127.0.0.1"), 7000);
//发送
ds.send(dp);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//接收端,自己和自己聊,没有实现接收端的发送功能
public class ReceverThread implements Runnable{private DatagramSocket ds;
public ReceverThread(DatagramSocket ds) {
this.ds=ds;
}
@Override
public void run() {
DatagramPacket p=null;
//接收
while(true){
byte[] recData=new byte[1024];
p=new DatagramPacket(recData,recData.length);
try {
ds.receive(p);
String s=new String(p.getData());
System.out.println(s);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Tcp实现文件上传:
客户端:
public class TcpClient {
public static void main(String[] args) throws UnknownHostException, IOException {
//创建连接
Socket s=new Socket(InetAddress.getByName("127.0.0.1"),3636);
//向通道写文件,高效流
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//读取要上穿传的文件流
String filePath="C:\\Users\\WakeHibernate\\Desktop\\copy\\Test910.txt";
File file=new File(filePath);
BufferedReader br=new BufferedReader(new FileReader(file));
//读写
String line=null;
while((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
//关闭资源
bw.close();
br.close();
s.close();
}
}
服务端:
public class TcpServer {
public static void main(String[] args) throws Exception {
//监听端口
ServerSocket ss=new ServerSocket(3636);
//获得一个连接点对象,简历通道
Socket flowS=ss.accept();
InputStream in=flowS.getInputStream();
//源
BufferedReader br=new BufferedReader(new InputStreamReader(in));
//目的
BufferedWriter bw=new BufferedWriter(new FileWriter("C:\\Users\\WakeHibernate\\Desktop\\456\\m.txt"));
String line=null;
while((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
br.close();
bw.close();
}
}
总结:
1tcp,udp,其实还是在使用流技术来进行交互。
2多线程在实现tcp编程编程是要注意监听IO流方法的阻塞。
3要理清客户端与服务端的交互关系