------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
###21.01_网络编程(网络编程概述)
* A:计算机网络
* 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
* B:网络编程
* 就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。
###21.02_网络编程(网络编程三要素之IP概述)
* 每个设备在网络中的唯一标识
* 每台网络终端在网络中都有一个独立的地址,我们在网络中传输数据就是使用这个地址。
* ipconfig:查看本机IP192.168.17.30
* ping:测试连接192.168.40.62
* 本地回路地址:127.0.0.1 255.255.255.255是广播地址
* IPv4:4个字节组成,4个0-255。大概42亿,30亿都在北美,亚洲4亿。2011年初已经用尽。
* IPv6:8组,每组4个16进制数。
* 1a2b:0000:aaaa:0000:0000:0000:aabb:1f2f
* 1a2b::aaaa:0000:0000:0000:aabb:1f2f
* 1a2b:0000:aaaa::aabb:1f2f
* 1a2b:0000:aaaa::0000:aabb:1f2f
* 1a2b:0000:aaaa:0000::aabb:1f2f
InetAddress:此类表示互联网协议 (IP) 地址。
IP 地址是 IP 使用的 32 位或 128 位无符号数字,它是一种低级协议,UDP 和 TCP 协议都是在它的基础上构建的
方法:
public static InetAddress getByName(String host)
在给定主机名的情况下确定主机的 IP 地址。
public String getHostName()
获取此 IP 地址的主机名。
public String getHostAddress()
返回 IP 地址字符串(以文本表现形式)。
<span style="font-size:14px;">public class InetAddressDemo {
public static void main(String[] args) throws UnknownHostException {
//获取IP地址对象
//InetAddress ipAddress = InetAddress.getByName("LKP-PC");
//InetAddress ipAddress = InetAddress.getByName("192.168.27.102");
InetAddress ipAddress = InetAddress.getByName("192.168.27.110");
//获取主机名称和IP地址
String name = ipAddress.getHostName();
String address = ipAddress.getHostAddress();
System.out.println("主机名:" + name +", ip地址: " + address);
}
}</span>
###21.03_网络编程(网络编程三要素之端口号概述)
* 每个程序在设备上的唯一标识
* 每个网络程序都需要绑定一个端口号,传输数据的时候除了确定发到哪台机器上,还要明确发到哪个程序。
* 端口号范围从0-65535
* 编写网络应用就需要绑定一个端口号,尽量使用1024以上的,1024以下的基本上都被系统程序占用了。
* 常用端口
* mysql: 3306
* oracle: 1521
* web: 80
* tomcat: 8080
* QQ: 4000
* feiQ: 2425
###21.04_网络编程(网络编程三要素协议)
* 为计算机网络中进行数据交换而建立的规则、标准或约定的集合。
* UDP
* 面向无连接,数据不安全,速度快。不区分客户端与服务端。
* TCP
* 面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。
* 三次握手: 客户端先向服务端发起请求, 服务端响应请求, 传输数据
###21.05_网络编程(Socket通信原理图解)
* A:Socket套接字概述:
* 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
* 通信的两端都有Socket。
* 网络通信其实就是Socket间的通信。
* 数据在两个Socket间通过IO流传输。
* Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和port。
###21.06_网络编程(TCP协议)
* 1.客户端
* 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
* 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
* 输入流可以读取服务端输出流写出的数据
* 输出流可以写出数据到服务端的输入流
<span style="font-size:14px;">public class TCPClient {
public static void main(String[] args) throws UnknownHostException, IOException {
//1:创建客户端的Socket对象
Socket s = new Socket("192.168.27.102", 10010);
//ConnectException: Connection refused: connect 找到了服务器,但是没服务器没启动
//2:获取Socket对象中的字节输出流对象
OutputStream os = s.getOutputStream();
//3:写数据到流中
os.write("abcde".getBytes());
//4:关闭Socket流
s.close();
}
}
</span>
* 2.服务端
* 创建ServerSocket(需要指定端口号)
* 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
* 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
* 输入流可以读取客户端输出流写出的数据
* 输出流可以写出数据到客户端的输入流
涉及的类:
* ServerSocket:
* 构造方法:
* public ServerSocket(int port)
创建绑定到特定端口的服务器套接字。方法:
public Socket accept()
等待客户端Socket对象的连接,当有客户端连接的时候,返回到客户端的Socket对象
Socket: 方法:
public InputStream getInputStream() 返回此套接字的输入流。
public InetAddress getInetAddress( )返回套接字连接的地址。
<span style="font-size:14px;">public class TCPServer {
public static void main(String[] args) throws IOException {
//1:创建服务器端的ServerSocket对象
ServerSocket ss = new ServerSocket(10010);
//2:等待客户端Socket对象的连接,当有客户端连接的时候,获取到客户端的Socket对象
Socket s = ss.accept();
//3:通过客户端Socket对象,获取它里面的字节输入流对象
InputStream is = s.getInputStream();
//4:读取数据
int ch = -1;
while ((ch = is.read()) != -1) {
System.out.print((char)ch);
}
//5:关闭Socket流
s.close();
ss.close();
}
}
</span>
###21.07_网络编程(TCP协议联系)
* 客户端
步骤:
* 1:创建客户端Socket对象,指定服务器IP地址,与端口号
* 2:获取Socket对象中的字节输出流
* 3:写数据到流中
* 4:告知,服务器端,数据已写完
* public void shutdownOutput()
禁用此套接字的输出流。
* 5:获取Socket对象中字节输入流
* 6:读取反馈信息
* 7:关闭流
<span style="font-size:14px;">public class TCPClient {
public static void main(String[] args) throws UnknownHostException, IOException {
//1:创建客户端Socket对象,指定服务器IP地址,与端口号
Socket s = new Socket("192.168.27.102", 10000);
//2:获取Socket对象中的字节输出流
//s.getOutputStream();
//高效的字符流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//3:写数据到流中
bw.write("哥们,你看见我了吗?");
bw.newLine();
bw.flush();
//4:告知,服务器端,数据已写完
s.shutdownOutput();
//5:获取Socket对象中字节输入流
//s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
//6:读取反馈信息
String result = br.readLine();
System.out.println("反馈信息: " + result);
//7:关闭流
s.close();
}
}
</span>
* 服务端
步骤:
* 1:创建服务器端的ServerSocket对象,指定端口号
* 2:等待客户端Socket对象的连接,当有客户端连接上时,获取到连接上的客户端Socket对象
* 3:通过客户端的Socket对象,获取字节输入流对象
* 4:读数据
* 5:获取客户端Socket对象的输出流对象
* 6:通过输出流对象,给客户端写反馈信息
* 7:关闭流
<span style="font-size:14px;">public class TCPServer {
public static void main(String[] args) throws IOException {
//1:创建服务器端的ServerSocket对象,指定端口号
ServerSocket ss = new ServerSocket(10000);
//2:等待客户端Socket对象的连接,当有客户端连接上时,获取到连接上的客户端Socket对象
Socket s = ss.accept();
//3:通过客户端的Socket对象,获取字节输入流对象
//s.getInputStream();
//高效的字符流
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
//4:读数据
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
//5:获取客户端Socket对象的输出流对象
//s.getOutputStream();
PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
//6:通过输出流对象,给客户端写反馈信息
pw.println("嗯,朕看见了");
//7:关闭流
s.close();
//ss.close();
}
}
</span>
###21.08_网络编程(练习)
需求: 不断的通过键盘录入,给服务器端发数据
* 步骤:
* 1:创建客户端的Socket对象,指定服务器的IP地址与端口号
* 2:通过客户端Socket对象,获取字节输出流对象
* 3:写数据到流中
* 4:告知服务器端,数据写入完毕
* 5:通过客户端的Socket对象,获取字节输入流对象
* 6:获取反馈信息
* 7:关闭流
<span style="font-size:14px;">public class TCPClient {
public static void main(String[] args) throws UnknownHostException, IOException {
//1:创建客户端的Socket对象,指定服务器的IP地址与端口号
Socket s = new Socket("192.168.27.102", 12345);
//2:通过客户端Socket对象,获取字节输出流对象
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//3:写数据到流中,不断的通过键盘录入
BufferedReader keyInput = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String str = keyInput.readLine();
//如果客户端输入的内容是886,客户端结束输入
if ("886".equals(str)) {
break;
}
bw.write(str);
bw.newLine();
bw.flush();
}
//4:告知服务器端,数据写入完毕
s.shutdownOutput();
//5:通过客户端的Socket对象,获取字节输入流对象
//s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
//6:获取反馈信息
String result = br.readLine();
System.out.println("反馈信息:" + result);
//7:关闭流
s.close();
}
}
</span>
TCP的服务器端
*
* 需求: 不断的接收客户端的消息,在控制台打印
*
* 步骤:
* 1:创建服务器端ServerSocket对象,指定端口号
* 2:等待客户端Socket对象的连接,当有客户端连接时,获取到当前的客户端Socket对象
* 3:通过客户端的Socket对象,获取字节输入流对象
* 4:读取数据
* 5:通过客户端的Socket对象,获取字节输出流对象
* 6:写反馈信息给客户端
* 7:关闭Socket流
<span style="font-size:14px;"> //1:创建服务器端ServerSocket对象,指定端口号
ServerSocket ss = new ServerSocket(12345);
while (true) {
//2:等待客户端Socket对象的连接,当有客户端连接时,获取到当前的客户端Socket对象
final Socket s = ss.accept();
//当有一个客户端连上服务器时,服务器开启一个新的线程来与客户端进行交互
new Thread(){
public void run() {
try{
//3:通过客户端的Socket对象,获取字节输入流对象
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
//4:读取数据
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
//5:通过客户端的Socket对象,获取字节输出流对象
PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
//6:写反馈信息给客户端
pw.println("朕看到了");
//7:关闭Socket流
s.close();
} catch (Exception e) {
e.printStackTrace();
}
};
}.start();
}
</span>
<span style="font-size:14px;"></span>
有兴趣的朋友可以再研究一下别的实例