网络编程

时间:2021-04-03 09:32:33   收藏:0   阅读:27

概述

计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统

网络编程的目的

无线电台...传播交流信息,数据交换,通信

想要达到这个效果需要什么

1.如何准确的定位网络上的一台主机 192.168.16.124:端口,定位到这个计算机上的某个资源

2.找到了这个主机,如何传输数据呢?

Javaweb:网页编程 B/S

网络编程:TCP/IP C/S

网络通信的要素

如何实现网络的通信?

通信双方地址:

规则:网络通信的协议

TCP/IP参考模型:

应用层:与其它计算机进行通信的一个应用,它是对应应用程序的通信服务的。例如,一个没有通信功能的字处理程序就不能执行通信的代码,从事字处理工作的程序员也不关心OSI的第七层。但是,如果添加了一个传输文件的选项,那么字处理器的程序就需要实现OSI的第7层。示例:TELNET,HTTP,FTP,NFS,SMTP等。

表示层:这一层的主要功能是定义数据格式及加密。例如,FTP允许你选择以二进制或者ASCII格式传输。如果选择二进制,那么发送方和接收方不改变文件的内容,如果选择ASCII格式,发送方将把文本从发送方的字符集转换成标准的ASCII后发送数据。在接收方将标准的ASCII转换成接收方计算机的字符集。示例:加密,ASCII等。

会话层:它定义了如何开始、控制和结束一个会话,包括对多个双向消息的控制和管理,以便在只完成连续消息的一部分时可以通知应用,从而使表示层看到的数据是连续的,在某些情况下,如果表示层收到了所有的数据,则用数据代表表示层。示例:RPC,SQL等。

传输层:这层的功能包括是否选择差错恢复协议还是无差错恢复协议,及在同一主机上对不同应用的数据流的输入进行复用,还包括对收到的顺序不对的数据包的重新排序功能。示例:TCP,UDP,SPX。

网络层:这层对端到端的包传输进行定义,它定义了能够标识所有结点的逻辑地址,还定义了路由实现的方式和学习的方式。为了适应最大传输单元长度小于包长度的传输介质,网络层还定义了如何将一个包分解成更小的包的分段方法。示例:IP,IPX等。

数据链路层:它定义了在单个链路上如何传输数据。这些协议与被讨论的各种介质有关。示例:AMD,FDDI等。

物理层:OSO的物理层规范是有关传输介质的特性,这些规范通常也参考了其他组织制定的标准。连接头、帧、帧的使用、电流、编码及光调制等都属于各种物理层规范中的内容。物理层常用多个规范完成对所有细节的定义。示例:Rj45,802.3等。

小结:

1.网络编程中有两个主要的问题

2.网络编程中的要素

3.万物皆对象

IP

ip地址:InetAddress

//测试IP
public class TestInetAddress {
public static void main(String[] args) {
try {
//查询本机地址
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
System.out.println(inetAddress);
InetAddress inetAddress2 = InetAddress.getByName("localhost");
System.out.println(inetAddress2);
InetAddress inetAddress3 = InetAddress.getLocalHost();
System.out.println(inetAddress3);
//查询网站IP地址
InetAddress inetAddress1 = InetAddress.getByName("www.baidu.com");
System.out.println(inetAddress1);
//常用方法
//System.out.println(inetAddress1.getAddress());
System.out.println(inetAddress1.getCanonicalHostName());//规范的
System.out.println(inetAddress1.getHostAddress());//IP
System.out.println(inetAddress1.getHostName());//域名,或者自己电脑的名字
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}

端口

端口表示计算机上的一个程序的进程;

netstat-ano #查看所有的端口
netstat-ano|findstr "5900" #查看指定的端口
tasklist|findstr "8696" #查看指定端口的进程
Ctrl+ shift + ESC

public class TestSocketAddress {
public static void main(String[] args) {
InetSocketAddress socketsAddress = new InetSocketAddress("127.0.0.1", 8080);
InetSocketAddress socketsAddress2 = new InetSocketAddress("localhost", 8080);
System.out.println(socketsAddress);
System.out.println(socketsAddress2);

System.out.println(socketsAddress.getAddress());
System.out.println(socketsAddress.getHostName());//hosts 地址
System.out.println(socketsAddress.getPort());//端口
}
}

通信协议

协议: 约定,就好比我们现在说的是普通化

网络通信协议:速率,传输码率,代码结构,传输控制......

大事化小:分层!

TCP/IP协议簇,实际上是一组协议

重要:

出名的协议:

TCP UDP对比

TCP:打电话

最少需要三次,保证稳定连接!
A:你瞅啥?
B:瞅你咋地?
A:干一场!

A:我要走了!
B:你真的要走了吗?
B:你真的真的要走了吗?
A:我真的要走了!

UDP:发短信

TCP

客户端

1.连接服务器 Socket

2.发送消息

//客户端
public class TcpClientDemo01 {
public static void main(String[] args) {
Socket socket = null;
OutputStream os = null;
//1.要知道服务器的地址
try {
InetAddress serverIP = InetAddress.getByName("127.0.0.1");
int port = 9999;
//2.创建一个socket连接
socket = new Socket(serverIP,port);
//3.发送消息 IO流
os = socket.getOutputStream();
os.write("你好,欢迎学习狂神说Java".getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

服务器

1.建立服务的端口 ServerSocket

2.等待用户的链接 accept

3.接收用户的消息

//服务端
public class TcpServerDemo01 {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
try {
//1.我得有一个地址
serverSocket = new ServerSocket(9999);
while (true){
//2.等待客户端连接过来
socket = serverSocket.accept();
//3.读取客户端得消息
is = socket.getInputStream();
//管道流
baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len=is.read(buffer))!=-1){
baos.write(buffer,0,len);
}
System.out.println(baos.toString());
}


/*
byte[] buffer = new byte[1024];
int len;
while ((len=is.read(buffer))!=-1){
String msg = new String(buffer,0,len);
System.out.println(msg);
}
*/
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭资源
if (baos != null) {
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

文件上传

服务端

public class TcpServerDemo02 {
public static void main(String[] args){
//1.创建服务
ServerSocket serverSocket = null;
Socket socket = null;
InputStream is = null;
FileOutputStream fos = null;
OutputStream os = null;
try {
serverSocket = new ServerSocket(9000);
//2.监听客户端的连接
socket = serverSocket.accept();//阻塞式监听,会一直等待客户端连接
//3.获取输入流
is = socket.getInputStream();
//4.文件输出
fos = new FileOutputStream(new File("receive.jpg"));
byte[] buffer = new byte[1024];
int len;
while ((len=is.read(buffer))!=-1){
fos.write(buffer,0,len);
}

//通知客户端我接收完毕了
os = socket.getOutputStream();
os.write("我接收完毕了,你可以断开了".getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally {//关闭资源
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket == null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (serverSocket == null) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

客户端

public class TcpClientDemo02 {
public static void main(String[] args){
//1.创建一个Socket连接
Socket socket = null;
OutputStream os = null;
FileInputStream fis = null;
InputStream inputStream = null;
ByteArrayOutputStream baos = null;
socket = new Socket(InetAddress.getByName("127.0.0.1"),9000);
//2.创建一个输出流
os = socket.getOutputStream();
//3.读取文件
InputStream resourceAsStream = TcpClientDemo02.class.getClassLoader().getResourceAsStream("com/liu/lesson02/linshu.jpg");
System.out.println(TcpClientDemo02.class.getClassLoader().getResource("/").getPath());
// fis = new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\linshu.jpg"));
// fis = new FileInputStream( new );

//4.写出文件
byte[] buffer = new byte[1024];
int len;
while ((len=resourceAsStream.read(buffer))!=-1){
os.write(buffer,0,len);
}
//通知服务器,我已经结束了
socket.shutdownOutput();//我已经传输完了
//确定服务器器接收完毕,才能断开连接
inputStream = socket.getInputStream();
//String byte[]
baos = new ByteArrayOutputStream();
byte[] buffer2 = new byte[2014];
int len2;
while ((len2=inputStream.read(buffer2))!=-1){
baos.write(buffer2,0,len2);
}
System.out.println(baos.toString());
} catch (IOException e) {
e.printStackTrace();
}finally { //5.关闭资源
if (baos != null) {
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

Tomcat

服务端

客户端

UDP

发送消息

发短信:不用连接,需要知道对方的地址!

咨询

循环发送

public class UdpSenderDemo01 {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(8888);
//准备数据:控制台读取System。in
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while (true){
String data = reader.readLine();
byte[] datas = data.getBytes();
DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",6666));
socket.send(packet);
if(data.equals("bye")){
break;
}
}
socket.close();
}
}

循环接收

public class UdpReceiveDemo01 {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(6666);

while (true){
//准备接收包裹
byte[] container = new byte[1024];
DatagramPacket packet = new DatagramPacket(container,0,container.length);
socket.receive(packet);//阻塞式接收包裹
//断开连接 bye
byte[] data = packet.getData();
String receiveData = new String(data, 0, data.length);
System.out.println(receiveData);
if (receiveData.equals("bye")){
break;
}
}
socket.close();
}
}

在线咨询,两个都可以是发送方,两个都可以是接收方!

URL

https://www.baidu.com/

统一资源定位符:定位资源的,定位互联网上的某一个资源

DNS域名解析

协议://IP地址:端口/项目名/资源

//http://localhost:8080/linshu/SecurityFile.txt
public class URLDemo01 {
public static void main(String[] args) throws MalformedURLException {
URL url = new URL("http://localhost:8080/helloworld/index.jsp?username=kuangshen&password=123");
System.out.println(url.getProtocol());//协议名
System.out.println(url.getHost());//主机IP
System.out.println(url.getPort());//端口
System.out.println(url.getPath());//文件地址
System.out.println(url.getFile());//文件全路径
System.out.println(url.getQuery());//查询名参数
}
}

原文:https://www.cnblogs.com/linhtx212318293/p/14607731.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!