Java学习网络编程全总结——TCPUdp多线程IO流Socket简易在线咨询聊天室Java爬虫
Posted 毛_三月
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习网络编程全总结——TCPUdp多线程IO流Socket简易在线咨询聊天室Java爬虫相关的知识,希望对你有一定的参考价值。
目录
网络编程
1.1、概述
信件:
打电话:—连接—接了—通话 TCP
发短信:—发送了就完事了—接收 UDP
计算机网络:
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
网络编程的目的:
传播交流信息,数据交换,通信。
想要达到这个效果需要什么:
1、如何准确地定位网络上的一台主机:(端口),定位到这个计算机的某个资源。
2、找到了这个主机,如何传输数据呢?
javaweb:网页编程 B/S
网络编程:TCP/IP C/S
1.2、网络通信的要素
如何实现网络上的通信?
通信双方地址:
(192.168.1.1):局域网。。
- ip:
- 端口号
规则:网络通信的协议:
TCP/IP参考模型:
HTTP:超文本传输协议
FTP:文件上传协议
小结:
1、网络编程中有两个主要的问题:
- 如何准确的定位到网络上的一台或者多台主机
- 找到主机之后如何进行通信
2、网络编程中的要素
- IP和端口号 IP
- 网络通信协议 UDP,TCP
3、万物皆对象
1.3、IP
ip地址:inetAddress
- 唯一定位一台网络上计算机
- 127.0.0.1:本机loaclhost
- Ip地址的分类
- Ipv4/Ipv6
- IPv4 127.00.1,四个字节组成,0-255,42亿(4,228,250,625);30亿都在北美,亚洲四亿,2011年就用尽;
- IPV6:128位,8个无符号整数!
- 公网(互联网)-私网(局域网)
- ABCD类地址
- 192.168.xx.xx专门给组织内部使用的
- Ipv4/Ipv6
- 域名:记忆IP问题!
- IP:
package com.mao.lesson01;
import java.net.InetAddress;
import java.net.UnknownHostException;
// 测试IP
public class TestInetAddress {
public static void main(String[] args) throws UnknownHostException {
// 查询本机地址
// getByName(String host) 确定主机名称的IP地址。
final InetAddress byName = InetAddress.getByName("127.0.0.1");
System.out.println(byName); // /127.0.0.1
final InetAddress localhost = InetAddress.getByName("localhost");
System.out.println(localhost); // localhost/127.0.0.1
// getHostAddress() 返回文本显示中的IP地址字符串。
final InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost); // DESKTOP-JDIH9D6/10.102.211.250
System.out.println("========================");
// 查询网站ip地址
final InetAddress byName1 = InetAddress.getByName("www.huchao.vip");
System.out.println(byName1); // www.huchao.vip/47.93.20.204
System.out.println("======================");
// 常用方法
//
System.out.println(byName1.getCanonicalHostName()); // 规范的名字 获取此IP地址的完全限定域名。 47.93.20.204
System.out.println(byName1.getHostAddress()); // ip 返回文本显示中的IP地址字符串。 47.93.20.204
System.out.println(byName1.getHostName()); // 域名,或者自己电脑的名字 获取此IP地址的主机名。 www.huchao.vip
}
}
1.4、端口(port)
端口表示计算机上的一个程序的进程
-
不同的进程有不同的端口号!用来区分软件!
-
被规定0-65535
-
TCP,UDP:65536*2 tcp:80,udp:80? 单个协议下,端口不能冲突、
-
端口分类:
-
公有端口0~1023
- HTTP:80
- https:443
- FTP:21
- Telent:23
-
程序注册端口:1024~49151
- Tomcat: 8080
- mysql: 3306
- Oracle: 1521
-
动态/私有:49152~65535
1、netstat -ano #查看所有的端口 2、netstat -ano|findstr "9640" # 查看指定的窗口 其中|是指先干后面的再在前面中找 3、tasklist|findstr "8696" #查看指定端口的进程
-
package com.mao.lesson01;
import java.net.InetSocketAddress;
public class TestInetSocketAddres {
public static void main(String[] args) {
final InetSocketAddress inetSocketAddress = new InetSocketAddress("47.93.20.204", 8080);
System.out.println(inetSocketAddress); // /47.93.20.204:8080
final InetSocketAddress localhost = new InetSocketAddress("localhost", 8080);
System.out.println(localhost); // localhost/127.0.0.1:8080
final InetSocketAddress inetSocketAddress1 = new InetSocketAddress("127.0.0.1", 8080);
System.out.println(inetSocketAddress1); // /127.0.0.1:8080
System.out.println("===================");
System.out.println(localhost.getAddress()); // localhost/127.0.0.1
System.out.println(localhost.getHostName()); // localhost
System.out.println(localhost.getPort()); // 8080
System.out.println("==================");
System.out.println(inetSocketAddress.getAddress()); // /47.93.20.204
System.out.println(inetSocketAddress.getHostName()); // 47.93.20.204
System.out.println(inetSocketAddress.getPort()); // 8080
}
}
1.5、通信协议
协议:约定,就好比我们现在说的是普通话。
网络通信协议:速率,传输码率,代码结构,传输控制。。。。。。
问题:非常的复杂
大事化小:分层!
TCP/IP协议簇:实际上是一层协议
重要:
- TCP:用户传输协议
- UDP:用户数据报协议
出名的协议:
- TCP:
- IP:网络互联协议
ps:应用层:QQ、微信;传输层:通信;网络层:分包;数据链路层:具体的传输:如光纤,海底电缆。。。。。。;
TCP UDP对比:
详解 TCP 连接的“ 三次握手 ”与“ 四次挥手 ”
https://baijiahao.baidu.com/s?id=1654225744653405133&wfr=spider&for=pc
TCP:打电话
-
连接,稳定
-
三次握手、四次挥手
-
三次握手
-
三次握手通俗理解
-
三次握手 最少需要三次,才能保证稳定连接! A;你愁啥? B:瞅你咋地? A:干一场!
四次挥手
四次挥手通俗理解
四次挥手 A:我要走了 B:你真的要走了吗? B:你真的真的要走了吗? A:我真的要走了!
-
客户端、服务端
-
传输完成,释放连接,效率低
UDP:发短信
- 不连接,不稳定
- 客户端、服务端:没有明确的界限
- 不管有没有准备好,都可以发给你。。。
- 导弹攻击
- DDOS:洪水攻击!(饱和攻击)
1.6、TCP
有关socket的知识分享:https://www.cnblogs.com/dolphinx/p/3460545.html
API
public class Socket
extends Object
implements Closeable
该类实现客户端套接字(也称为“套接字”)。套接字是两台机器之间通讯的端点。
套接字的实际工作由SocketImpl
类的实例执行。 应用程序通过更改创建套接字实现的套接字工厂,可以配置自己创建适合本地防火墙的套接字。
-
从以下版本开始:
JDK1.0
SeverSocket:
API
public class ServerSocket
extends Object
implements Closeable
这个类实现了服务器套接字。 服务器套接字等待通过网络进入的请求。 它根据该请求执行一些操作,然后可能将结果返回给请求者。
服务器套接字的实际工作由SocketImpl类的实例执行。 应用程序可以更改创建套接字实现的套接字工厂,以配置自己创建适合本地防火墙的套接字。
为了使客户能成功地连接到服务器,服务器必须建立一个ServerSocket 对象,该对象通过将客户端地套接字对象和服务器端地一个套接字对象连接起来,从而达到连接的目的。
客户端:(socket对象)socket(IP地址,端口)
服务器:(ServerSocket对象)serversocket(端口 )用ServerSocket.accept()来建立一个和客户端的Socket对象相连接的Socket对象。
服务器端的输出流/输入流的目的地和客户端的输入流/输出流的源刚好相同。
服务端代码:
package com.mao.lesson02;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
// 服务端
public class TestServerDemo01 {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket accept = null;
InputStream inputStream = null;
ByteArrayOutputStream byteArrayOutputStream = null;
try {
// 1.我得有一个地址
serverSocket= new ServerSocket(9999);
while (true){
//2. 等待客户端连接过来
accept = serverSocket.accept();
//3. 读取客户端的消息
inputStream = accept.getInputStream();
// 管道流
byteArrayOutputStream = new ByteArrayOutputStream();
byte[] bytes = new byte[1024];
int length;
while ((length=inputStream.read(bytes))!=-1){
byteArrayOutputStream.write(bytes,0,length);
}
System.out.println(byteArrayOutputStream.toString());
}
} catch (IOException ioException) {
ioException.printStackTrace();
}finally {
if (byteArrayOutputStream!=null){
try {
byteArrayOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (inputStream!=null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (accept!=null){
try {
accept.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (serverSocket!=null){
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
客户端代码
package com.mao.lesson02;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
//客户端
public class TcpClientDemo01 {
public static void main(String[] args) {
InetAddress byName =null;
Socket socket=null;
OutputStream outputStream=null;
try {
//1.要知道服务器的地址,端口号
byName = InetAddress.getByName("127.0.0.01");
int port =9999;
//2.创建一个socket连接
socket = new Socket(byName,port);
//3.发送消息 io 流
outputStream = socket.getOutputStream();
outputStream.write("你好,我是胡超,欢迎和我一起学习Java网络编程".getBytes());
} catch (Exception e) {
e.printStackTrace();
}finally {
if (socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (outputStream!=null){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
每执行一次客户端代码,都会在服务端显示一次
进程堵塞
提升作用域
文件上传
服务器端:
package com.mao.lesson02;
import com.sun.org.apache.bcel.internal.generic.NEW;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @Author HuChao
* @Description //TODO Hasee
* @Date 17:28 2021/11/2
* @Param
* @return
**/
public class TcpServerDemo02 {
public static void main(String[] args) throws Exception {
// 1.创建服务
final ServerSocket serverSocket = new ServerSocket(9000);
// 2.监听客户端连接
final Socket socket = serverSocket.accept(); //阻塞式监听,会一直等待客户端的到来
// 3.获取输入流
final InputStream inputStream = socket.getInputStream();
// 4.文件输出
final FileOutputStream fileOutputStream = new FileOutputStream(new File("recevie.png"));
//创立缓冲区和写
final byte[] bytes = new byte[1024];
int length;
while ((length=inputStream.read(bytes))!=-1){
fileOutputStream.write(bytes,0,length);
}
// 通知客户端接受完毕
final OutputStream outputStream = socket.getOutputStream();
outputStream.write("客户端,服务都端接受完毕了,你可以断开了".getBytes());
// 关闭资源
outputStream.close();
fileOutputStream.close();
inputStream.close();
socket.close();
serverSocket.close();
}
}
/*
1、接收要read,所以要用inputStream
2、要把文件写给大家看,所以要fileoutputstream
*/
客户端:
package com.mao.lesson02;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* @Author HuChao
* @Description //TODO Huchao
* @Date 17:28 2021/11/2
* @Param
* @return
**/
public class TcpClientDemo02 {
public static void main(String[] args) throws Exception {
// 1.创建一个socket连接
final Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
// 2.创建一个输出流
final OutputStream outputStream = socket.getOutputStream();
// 3.读取文件
final FileInputStream fileInputStream = new FileInputStream(new File("双湖拍.png"));
// 4.写出文件
final byte[] bytes = new byte[1024];
int length;
while ((length=fileInputStream.read(bytes))!=-1){
outputStream.write201621123078《Java程序设计》第11周学习总i结