------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!-----
一、网络概述
网络编程三要素:
IP
IP地址是计算机或设备在网络上的唯一标识。
192.168.1.1 ip地址
255.255.255.0广播地址
Ipv4:4个字节 4个 0-255
端口
端口号是每个程序在设备上的唯一标识
常用默认端口号:
mysql:3306
Oracle:1521
Tomcat:8080
QQ:4000
FieQ:2425
Apache Nginx:80
协议
为计算机网络中进行数据交换而建立的规则、标准或约定的集合。
UDP:面向无连接,数据不安全,速度快64K。不区分客户端与服务端。
TCP :面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。
三次握手: 客户端先向服务端发起请求, 服务端响应请求, 传输数据
网络模型
OSI七层模型:
TCP/IP参考模型
Socket通信原理
Socket就是为网络服务提供的一种机制。
通信的两端都有Socekt.
数据在Socket两端通过IO传输。
二、UDP协议
流程:
1.发送Send
创建DatagramSocket, 随机端口号
创建DatagramPacket, 指定数据, 长度, 地址, 端口
使用DatagramSocket发送DatagramPacket
关闭DatagramSocket
2.接收Receive
创建DatagramSocket, 指定端口号
创建DatagramPacket, 指定数组, 长度
使用DatagramSocket接收DatagramPacket
关闭DatagramSocket
从DatagramPacket中获取数据3.接收方获取ip和端口号
String ip = packet.getAddress().getHostAddress();
int port = packet.getPort();
练习:
/*聊天小程序 *思路:收发同时执行多线程 * */ import java.io.*; import java.net.*; public class ChatDemo { public static void main(String[] args) throws SocketException { new Thread(new Send(new DatagramSocket())).start(); new Thread(new Receive(new DatagramSocket(10001))).start(); } } class Send implements Runnable { //接收信息线程 private DatagramSocket ds ; //定义成员变量Socket Send(DatagramSocket ds) { //构造方法 this.ds = ds; } public void run() { //override run方法 //键盘输入流 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line = null; try { while((line = br.readLine()) != null) { //循环读取键盘输入,readLine方法为阻塞方法 if(line.endsWith("bye")) //结束标记 break; byte[] buf = line.getBytes(); //每读一行存入字节数组 //封包 DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.1.2"),10001); ds.send(dp);//发包 } } catch (Exception e) { // TODO Auto-generated catch block throw new RuntimeException("send fail"); } } } class Receive implements Runnable { private DatagramSocket ds ; Receive(DatagramSocket ds) { this.ds = ds; } public void run() { try { while(true) { byte[] buf = new byte[1024]; //定义字节数组 DatagramPacket dp = new DatagramPacket(buf, buf.length);//定义接受Packet ds.receive(dp);//接收已经存入本方Packet的数据包 String ip = dp.getAddress().getHostAddress(); String data = new String(dp.getData(),0,dp.getLength());//拆包 System.out.println(ip+"....."+data); } } catch (Exception e) { // TODO Auto-generated catch block throw new RuntimeException("send fail"); } } }
三、TCP协议
步骤:
创建客户端和服务端
创建ServerSocket和Socket对象
建立链接后通过Socket中的IO进行数据传输:OutputStream = ss.getOutputstream();
关闭Socket
练习一:客户端键盘录入,服务端将录入文本反转并转换为大写
/*小练习,客户端从控制台接收文本信息,发送至服务端,服务端将文本转换为大写后传回客户端并打印到客户端控制台 * 服务端流程: * 1:建立ServerSocket对象,指定服务端监听的portID * 2:调用ss.accept()方法获取客户端Socket对象 * 3:获取IO通道 * 4:将接收的数据大小写转换,并写入IO通道 * */ import java.io.*; import java.net.*; import java.util.Scanner; public class Server { public static void main(String[] args) { try { ServerSocket ss = new ServerSocket(10003);//建立ServerSocket对象,指定服务端监听的portID Socket s = ss.accept();//获取客户端Socket示例 PrintWriter ps = new PrintWriter(s.getOutputStream(),true);//打印流自动刷新 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); String line = null; StringBuffer sb = new StringBuffer(); while((line = br.readLine()) != null) { sb.append(line); line = sb.reverse().toString();//利用StringBuffer反转字符串 ps.println(line.toUpperCase());//大小写转换 } s.close(); ss.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
/*客户端 * 1、建立Socket指定目的IP和端口号 * 2、建立输入流读取本地控制台 * 3、建立IO通道 * 4.发送控制台所接收的数据 * 5、读取返回来的IO通道数据 * */ import java.io.*; import java.net.*; import java.util.Scanner; public class Client { public static void main(String[] args) { try { Socket s = new Socket("192.168.1.101",10003);//建立Socket指向服务器 Scanner sc = new Scanner(System.in);//Scanner对象接收键盘录入 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); OutputStream os = s.getOutputStream(); BufferedWriter bwos = new BufferedWriter(new OutputStreamWriter(os)); String line = null; while(true) { line = sc.nextLine(); if(line.equals("end")) break; bwos.write(line); bwos.newLine(); bwos.flush(); System.out.println(br.readLine()); } s.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
练习二
客户端并发向服务器上传图片
/*服务器 * */ import java.io.*; import java.net.*; public class Server { public static void main(String[] args) throws Exception { ServerSocket ss = new ServerSocket(10003); while(true) { new Thread(new Upload(ss.accept())).start(); } } } class Upload implements Runnable { //线程Upload实现上传功能 private Socket s; Upload(Socket s) { this.s = s; } public void run() { try { BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); InputStream is = s.getInputStream(); File f = new File("F:\\abc.jpg"); //创建文件 int count = 0; while(f.exists()) { //重复改名 f = new File("F:\\abc("+(++count) +").jpg"); } FileOutputStream os = new FileOutputStream(f); byte[] temp = new byte[1024*1024]; int len; while((len = is.read(temp)) != -1) { os.write(temp,0,len); } String ip = s.getInetAddress().getHostAddress(); bw.write(new String("ip:...."+ip+ "Upload Down")); //返回信息 bw.flush(); bw.close(); os.close(); s.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
/*客户端上传文件至服务器 * */ import java.io.*; import java.net.*; public class Client { public static void main(String[] args) throws Exception { Socket s = new Socket("192.168.1.101",10003); FileInputStream localIs = new FileInputStream(new File("F:\\a.jpg")); //本地输入流关联文件 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));//网络通道 OutputStream os = s.getOutputStream(); byte[] temp = new byte[1024*1024]; int len = 0; while((len =localIs.read(temp)) != -1) { os.write(temp, 0, len); } s.shutdownOutput(); //标记,传输完成 System.out.println(br.readLine()); //获取服务器返回信息 s.close(); //关闭socket,关闭链接释放资源 } }
四、其他网络知识小结
浏览器服务器通信原理:
浏览器相当于一个客户端,在TextField输入服务器地址,解析地址后,获得ip和端口,建立和服务器的连接。
所发送的数据加上报文头,封包,传至服务器。服务器解包处理后,返回数据给客户端,同样加上报文头封包。
客户端解析数据。
URL和域名解析
URL:http:\\www.baidu.com\index.html
域名:www.baidu.com
URL url = new Url("");
URLConnection conn = url.openConnection();//应用层网络连接