一.网络编程基础
1.按照地域分为:广域网 城域网 局域网。
2.网络参考模型:七层 物理层 数据链路层 网络层 传输层 会话层 表示层 应用层
TCP/IP参考模型 1.链路层(物理层和数据链路层)2.网络层 3.传输层 4.应用层(应用层 表示层 会话层)。
3.通信协议分为 网络层IP协议 IPV4和IPV6,互联网协议
传输层协议:TCP(三次握手四次断开)和UDP(提供面向事务的简单不可靠信息传送服务大小为64kb)
应用层协议:HTTP, FTP SMTP POP3
二.计算机之间通信
1.ip地址是数字型的,32位整数通常分为四个八位的二进制数,每八位用 . 隔开。
IPV4地址分类(127.0.0.1本机)
A类:保留给政府结构,1.0.0.1 ~ 126.255.255.254
B类:分配给中型企业,128.0.0.1 ~ 191.255.255.254
C类:分配给任何需要的个人,192.0.0.1 ~ 223.255.255.254
D类:用于组播,224.0.0.1 ~ 239.255.255.254
E类:用于实验,240.0.0.1 ~ 255.255.255.254
2.端口:发送和接受数据都需要通过端口进出计算机,用于唯一标识通信实体上进行网络通讯的程序。
三.相关类的使用
1.InetAddress:获取ip地址,对ip地址抽取和封装
public class Demo1 {
public static void main(String[] args) {
InetAddress id=null;
try {
id=InetAddress.getLocalHost();
String str=id.gethostname();
System.out.println(id);
System.out.println(str);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
根据主机名确定主机ip地址:InetAddress id=InetAdress.getByName(192.168.133.1); System.out.println(id);
ip地址也可以换成网站名字,也可以获取id;
2.URLEncode类和URLDecode类:用于完成普通字符串和application/www.cccz.com等字符的转换。
//URLDecoder:解码,将特殊中文字符串转换为普通字符串
String string1 = URLDecoder.decode("%E5%8D%83%E9%94%8B", "utf-8");
System.out.println(String1);
//URLEncoder:编码,将普通字符串转换为特殊字符串
String string2 = URLEncoder.encode("Java的开发指南", "GBK");
System.out.println(string2);
四.基于TCP的网络编程
1.TCP传输控制协议,基于字节流的传输层通信协议。(1)安全可靠(2)面向对象(3)大小受限制但是连接以后数据随意传了。(4)效率低。 三次握手:a.客户端向服务器发送一个请求 b.服务端收到请求后回客户端一个响应 c.客户端收到响应后回服务器一个确认信息。
五.Socket和ServerSocket
//客户端
import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class Demo2 {
public static void main(String[] args) throws Exception{
Socket socket=new Socket("192.168.133.1", 9808);
OutputStream os=socket.getOutputStream();
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os));
bw.write("周董真胖");
bw.flush();
bw.close();
socket.close();
}
}
//服务器端 先开启服务器端,在开客户端
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Demo3 {
public static void main(String[] args) throws Exception{
ServerSocket listener=new ServerSocket(9808);
System.out.println("服务器开了");
Socket socket=listener.accept();
InputStream is=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String data=br.readLine();
System.out.println("客户端说的是"+data);
br.close();
socket.close();
listener.close();
}
}
2.客户端发送消息,服务端回复消息
建立一个鱼服务器之间的连接,socket首先赋值为空.写端口号或者ip地址, outputstream,os.write写上要说的话。刷新
再在客户端写上接受信息的inputstream (记得用try catch盖住错误) close结束
服务端,先接受的socket变为空,接受客户端发来的消息,读取数据,打印出来,然后使用outputstream回复消息,刷新,也需要用try catch盖住 最后close。
3.上传文件:BufferedInputStream input = new BufferedInputStream(new FileInputStream(new File("file/client/image.png")));
换成文件输入流
4.多个客户和一个服务段通信:1.构建客户端对象,null 2.输出 3.控制台获取数据 Scanner scanner=new Scanner(system.in);
4.进行循环的发送和接受消息 然后发送 再接受消息 最后跳出接受消息。5.释放资源 clinet.close();
System.out.println("客户端对服务端说:");
String message = scanner.nextLine();
//发送
output.write(message.getBytes());
output.flush();
//接受消息
byte[] arr = new byte[1024];
int len = input.read(arr);
String reply = new String(arr, 0, len);
System.out.println("收到服务端的反馈:" + reply);
//跳出接受结构
if(reply.equals("886") || reply.equals("bye") ||reply.equals("再见")){
break;
}
构建服务段:1.创建服务段对象 null 2.通过循环为不同的客户端进行服务,循环体内,创建线程 socket.client=server.accept();
ServerThread thread = new ServerThread(client);
thread.start();
3.线程的执行体里面,进行发送消息和接受消息的操作 serverthread 继承Thread 重写run方法
4.从控制台获取消息,再加上回复的消息,约定一个结束语句。
TCP实现注册登录:跟单例很相似。
六.UDP编程
1.User Datagram Protocol 用户数据包协议,提供面向事务的简单不可靠信息传送服务。
2.特点: a不安全 b无连接 c效率高 d有大小限制,数据包必须限定在64kb之内
3.DatagramSocket 数据报套接字,表示用来发送和接受数据报包的套接字
DatagramPachet 表示数据报包,每个包最大64kb
4.接收方byte[] arr = new byte[1024];
DatagramPacket packet = new DatagramPacket(arr, arr.length);
TCP的Socket与UDF:
ServerSocket 服务器套接字 写服务端的步骤:
1.创建服务器套接字 ServerSocket listener=new ServerSocket(6666);
2.侦听 listener.accept()
3.获取输入或者输出流;
4.处理数据
5.关闭流
客户端步骤:
1.创建socket 客户端套接字,指定服务端的ip和端口号,自动连接
2.获取输入或者输出流
3.处理数据
4.关闭流。
UDP:
1.DatagramSocket:相当于快递点给包装好
2.DatagramPacket:包裹,传送数据包