网络编程

1.1概述

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

网络编程的目的:传播交流信息、数据交换、通信。

想要达到什么效果需要什么:

  1. 如何准确定位网络上的某台主机。IP地址+端口。定位到计算机上的某个资源。
  2. 找到这台主机,如何传输数据。

网络编程:TCP/IP C/S

1.2、网络通信的要素

如何实现网络的通信:

通信双方的地址:

  • IP

  • 端口号

规则:网络通信的协议。

小结:

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

    • 如何准确的定位到网络上的一台或多台主机。(ping命令)
    • 找到主机后如何进行通信。
  2. 网络编程中的要素:
    • IP地址和端口号
    • 网络通信协议

1.3、IP地址

IP地址:InetAddress

  • 唯一定位一台网络上的计算机
  • 127.0.0.1:本机,localhost
  • 域名:便于记忆IP地址
package com.zhang.lesson01;
//测试IPimport java.net.InetAddress;
import java.net.UnknownHostException;public class TestInetAdress {public static void main(String[] args) {try {//查询本机地址InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");System.out.println(inetAddress1);InetAddress inetAddress3 = InetAddress.getByName("localhost");System.out.println(inetAddress3);InetAddress inetAddress4 = InetAddress.getLocalHost();System.out.println(inetAddress4);//查询网站IP地址InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com");System.out.println(inetAddress2);//常用方法System.out.println(inetAddress2.getAddress());System.out.println(inetAddress2.getCanonicalHostName());//规范的名字System.out.println(inetAddress2.getHostAddress());//ipSystem.out.println(inetAddress2.getHostName());//域名,或者自己电脑的名字} catch (UnknownHostException e) {e.printStackTrace();}}
}

1.4、端口Port

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

  • 不同的进程有不同的端口号,用来区分软件。
  • 端口被规定为0-65535
  • 单个协议下,端口号不能冲突

一些简单命令:

netstat -ano #查看所有端口
netstat -ano|findsr "  "  #查找具体端口
tasklist|findsr "  "
ctrl + shift + esc  #打开任务管理器
package com.zhang.lesson01;import java.net.InetSocketAddress;//
public class TestInetSocketAdress {public static void main(String[] args) {InetSocketAddress address1 = new InetSocketAddress("127.0.0.1", 8080);System.out.println(address1);InetSocketAddress address2 = new InetSocketAddress("localhost", 8080);System.out.println(address2);System.out.println(address1.getAddress());System.out.println(address1.getHostName());System.out.println(address1.getPort());}
}

1.5、通信协议

协议:就是约定。

**网络通信协议:**速率、传输速率、代码结构、传输控制~

TCP/IP协议簇

重要:

  • TCP:用户传输协议
  • UDP:用户数据报协议
  • IP:网络互连协议

1.6、TCP

1.6.1 TCP实现聊天

客户端

  1. 连接服务器Socket
  2. 发送消息
package com.zhang.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) {//1.需要一个地址Socket socket=null;OutputStream outputStream=null;try {InetAddress serverip = InetAddress.getByName("127.0.0.1");//2.端口号int port=9999;//3.创建一个socket连接socket = new Socket(serverip,port);//4.发送消息outputStream = socket.getOutputStream();outputStream.write("你好,欢迎学习Java".getBytes());} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {if(outputStream!=null){try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}if(socket!=null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}
}

服务器

  1. 建立服务器端口ServerSocket
  2. 等待用户连接accept
  3. 接收用户消息
package com.zhang.lesson02;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;//服务器端
public class TcpServerDemo01 {public static void main(String[] args) {//1.我得有个地址ServerSocket serverSocket=null;Socket socket=null;InputStream inputStream=null;ByteArrayOutputStream byteArrayOutputStream=null;try {serverSocket = new ServerSocket(9999);//2.等待客户端连接while (true) {socket = serverSocket.accept();//3.读取客户端的消息inputStream = socket.getInputStream();//管道流byteArrayOutputStream = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int length;while ((length = inputStream.read(buffer)) != -1) {byteArrayOutputStream.write(buffer, 0, length);}System.out.println(byteArrayOutputStream.toString());}} catch (IOException e) {e.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(socket!=null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}if(serverSocket!=null){try {serverSocket.close();} catch (IOException e) {e.printStackTrace();}}}}
}

1.6.2 TCP实现文件上传

客户端:

package com.zhang.lesson02;import java.io.*;
import java.net.InetAddress;
import java.net.Socket;public class TcpClientDemo02 {public static void main(String[] args) throws Exception {//创建socket连接Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9090);//2.创建一个输出流OutputStream os = socket.getOutputStream();//3.文件流FileInputStream fis = new FileInputStream("bizhi.jpg");//4.写出文件byte[] buffer = new byte[1024];int len;while((len=fis.read(buffer))!=-1){os.write(buffer,0,len);}//通知服务器结束socket.shutdownOutput();//传输完毕//确定接收完毕InputStream inputStream = socket.getInputStream();//String byte[]ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer2 = new byte[1024];int len2;while((len2=inputStream.read(buffer2))!=-1){baos.write(buffer2,0,len2);}System.out.println(baos.toString());//5.关闭资源baos.close();inputStream.close();fis.close();socket.close();}
}

服务器:

package com.zhang.lesson02;import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;public class TcpServerDemo02 {public static void main(String[] args) throws Exception {//1.创建服务ServerSocket serverSocket = new ServerSocket(9090);//2.监听客户端的连接Socket socket = serverSocket.accept();//阻塞式监听,一直等待客户端连接//3.获取输入流InputStream is = socket.getInputStream();//4.文件输出FileOutputStream 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);}//通知客户端接收完毕OutputStream os = socket.getOutputStream();os.write("我接受完毕,你可以断开l".getBytes());//关闭资源fos.close();is.close();socket.close();serverSocket.close();}
}

1.7、UDP

1.7.1 UDP发送消息

发送端:

package com.zhang.lesson03;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class TestUdpClient {public static void main(String[] args) throws Exception {//不需要连接服务器//1.建立一个socketDatagramSocket socket = new DatagramSocket();//2.建个包String msg="你好啊,我是胡歌";//发送给谁InetAddress localhost = InetAddress.getByName("localhost");int port=9000;//数据,数据的长度起始,要发送给谁DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);//3.发送包socket.send(packet);//4.关闭流socket.close();}
}

接收方:

package com.zhang.lesson03;import java.net.DatagramPacket;
import java.net.DatagramSocket;public class TestUdpServer {public static void main(String[] args) throws  Exception{//1.开放端口DatagramSocket socket = new DatagramSocket(9000);//2.接收数据包byte[] buffer = new byte[1024];DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);socket.receive(packet);//System.out.println(packet.getData().toString());System.out.println(packet.getAddress());System.out.println(new String(packet.getData(),0,packet.getLength()));//3.关闭连接socket.close();}
}

1.7.2 UDP实现聊天

发送方:

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

接收方:

package com.zhang.chart;import java.net.DatagramPacket;
import java.net.DatagramSocket;public class UdpReceiveDemo01  {public static void main(String[] args) throws Exception {DatagramSocket socket = new DatagramSocket(8000);while (true){//准备接收包裹byte[] container = new byte[1024];DatagramPacket packet = new DatagramPacket(container,0,container.length);socket.receive(packet);//阻塞式接收包裹//断开连接byte[] data=packet.getData();String rdata = new String(data, 0, packet.getLength());System.out.println(rdata);if (rdata.equals("bye")){break;}}socket.close();}
}

1.7.3 UDP实现多线程聊天

首先分别写出信息发送类,以及信息接收类。

信息发送类:

package com.zhang.chart;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;public class TalkSender implements Runnable {DatagramSocket socket = null;BufferedReader reader = null;private String toIP;private int toPort;private int fromPort;public TalkSender(String toIP, int toPort, int fromPort) {this.toIP = toIP;this.toPort = toPort;this.fromPort = fromPort;try {socket = new DatagramSocket(fromPort);reader = new BufferedReader(new InputStreamReader(System.in));} catch (SocketException e) {e.printStackTrace();}}@Overridepublic void run() {while (true) {try {String data = reader.readLine();DatagramPacket packet = new DatagramPacket(data.getBytes(), 0, data.getBytes().length, new InetSocketAddress(this.toIP,this.toPort));socket.send(packet);if (data.startsWith("bye")) {break;}} catch (IOException e) {e.printStackTrace();}}}
}

信息接收类:

package com.zhang.chart;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class TalkReceiver implements Runnable{DatagramSocket socket=null;private int Port;private String msgFrom;public TalkReceiver(int port,String msgFrom) {this.Port = port;this.msgFrom=msgFrom;try {socket=new DatagramSocket(port);} catch (SocketException e) {e.printStackTrace();}}@Overridepublic void run() {while (true){try {//准备接收包裹byte[] container = new byte[1024];DatagramPacket packet = new DatagramPacket(container,0,container.length);socket.receive(packet);//阻塞式接收包裹//断开连接byte[] data=packet.getData();String rdata = new String(data, 0, packet.getLength());System.out.println(msgFrom+":"+rdata);if (rdata.equals("bye")){break;}} catch (IOException e) {e.printStackTrace();}}socket.close();}
}

两个具有多线程的启动类:

package com.zhang.chart;public class TalkStudent {public static void main(String[] args) {//开启两个线程new Thread(new TalkSender("localhost",9999,7777)).start();new Thread(new TalkReceiver(8888,"老师")).start();}
}
package com.zhang.chart;public class TalkTeacher {public static void main(String[] args) {new Thread(new TalkSender("localhost",8888,5555)).start();new Thread(new TalkReceiver(9999,"学生")).start();}
}

1.8、URL

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

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

初识URL类。

package com.zhang.lesson04;import java.net.MalformedURLException;
import java.net.URL;public class URLDemo01 {public static void main(String[] args) throws MalformedURLException {URL url = new URL("http://localhost:80/helloworld/index");System.out.println(url.getPath());//文件System.out.println(url.getProtocol());//协议System.out.println(url.getHost());//IP//.....}
}

URL下载文档。这里我在网页版网易云下载到了一首歌曲《New Boy》,有兴趣可以自己操作哦。

package com.zhang.lesson04;import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;public class UrlDown {public static void main(String[] args) throws Exception{//1.下载地址URL url = new URL("https://m801.music.126.net/20210803202948/9a3ef3141be50e1a5974151a7649e1f1/jdyyaac/obj/w5rDlsOJwrLDjj7CmsOj/9840227679/a5cf/2261/7132/e26562647c7ce931b0cc7545ff1883b5.m4a");//2.连接到这个资源HttpURLConnection urlConnection=(HttpURLConnection)url.openConnection();InputStream inputStream = urlConnection.getInputStream();FileOutputStream fos = new FileOutputStream("file01.m4a");byte[] buffer = new byte[1024];int len;while((len=inputStream.read())!=-1){fos.write(buffer,0,len);}fos.close();inputStream.close();urlConnection.disconnect();}

希望对大家有帮助~

网络编程入门(代码很详细)相关推荐

  1. BIO,Socket网络编程入门代码示例,NIO网络编程入门代码示例,AIO 网络编程

    BIO,Socket网络编程入门代码示例 1.BIO服务器端程序 package cn.itcast.bio;import java.io.InputStream; import java.io.Ou ...

  2. Flash:Flash动画设计软件界面的简介、Flash AS 3.0代码编程入门教程之详细攻略

    Flash:Flash动画设计软件界面的简介.Flash AS 3.0代码编程入门教程之详细攻略 目录 Flash动画设计软件界面的简介 快捷键 菜单栏 下边工具栏 右边工具栏 工具箱 Flash A ...

  3. 脑残式网络编程入门(三):HTTP协议必知必会的一些知识

    为什么80%的码农都做不了架构师?>>>    本文原作者:"竹千代",原文由"玉刚说"写作平台提供写作赞助,原文版权归"玉刚说&q ...

  4. Android网络编程入门解析

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

  5. Day14:网络编程入门

    网络编程入门 计算机网络基础 计算机网络是独立自主的计算机互联而成的系统的总称,组建计算机网络最主要的目的是实现多台计算机之间的通信和资源共享.今天计算机网络中的设备和计算机网络的用户已经多得不可计数 ...

  6. Linux网络编程 入门

    Linux网络编程入门 (转载) (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍 客户端和服务端          网络程序和普通的程序有一个最大的区别是网络程序是由两个 ...

  7. 脑残式网络编程入门(八):你真的了解127.0.0.1和0.0.0.0的区别?

    本文由"小姐姐养的狗"原创发布于"小姐姐味道"公众号,原题<127.0.0.1和0.0.0.0地址的区别>,收录时有优化和改动.感谢原作者的分享. ...

  8. 脑残式网络编程入门(五):每天都在用的Ping命令,它到底是什么?

    本文引用了公众号纯洁的微笑作者奎哥的技术文章,感谢原作者的分享. 1.前言 老于网络编程熟手来说,在测试和部署网络通信应用(比如IM聊天.实时音视频等)时,如果发现网络连接超时,第一时间想到的就是使用 ...

  9. WinPcap网络编程入门——1. 获取设备列表

    WinPcap网络编程入门--1. 获取设备列表 系列教程章节直达: Winpcap网络编程入门--1. 获取设备列表: 上节中我们简单介绍了 WinPcap 的相关资料,配置好了开发环境,现在就让我 ...

  10. Day14 -A 网络编程入门

    网络编程入门 计算机网络基础 计算机网络是独立自主的计算机互联而成的系统的总称,组建计算机网络最主要的目的是实现多台计算机之间的通信和资源共享.今天计算机网络中的设备和计算机网络的用户已经多得不可计数 ...

最新文章

  1. 「智源论坛·学者报告会」报名: 面向高效推理的深度网络结构设计
  2. 基于matlab_simulink的捷联惯性导航系统仿真,基于MATLAB/Simulink的捷联惯性导航系统仿真...
  3. 理解 RXSwift:单元测试(四)
  4. arm 驱动基础:查询方式的按键驱动程序
  5. python chrome headless_[技巧] chrome headless 爬虫抓取websoket 数据
  6. 第13讲nbsp;日期和时间nbsp;EXCEL2010…
  7. 无论是工作还是生活都要记住这些话
  8. python3集合_Python3 集合
  9. c语言学习-在一个三行三列的矩阵中求出数值最大的元素及其行/列下标并打印输出
  10. IIS7.5(IIS7)配置伪静态urlrewrite
  11. 赋值运算符函数__from 剑指Offer
  12. 解决 网上下载的例子 My Mac 64-bit 不能运行的问题
  13. csdn资源下载不了问题解决 360浏览器下载不了csdn资源问题解决
  14. 一个实用的小工具——键盘映射KeyTweak
  15. FIT2CLOUD入选2018 Gartner Cool Vendor
  16. SketchUp 7 linux,SketchUp各版本有哪些兼容性更改?
  17. linux的if语句并且命令,linux命令:if语句练习
  18. C#中Get和Set的用法
  19. 网络同步时钟系统_NTP时间服务器
  20. exec()和eval()

热门文章

  1. [文摘20080226]领导法则 - 陈安之
  2. oracle查询备份存储路径,Oracle 数据库备份与恢复(RMAN介绍一)
  3. SSH框架的详细介绍
  4. linux系统日志message 分析,Linux系统日志及日志分析
  5. 韩信点兵python算法_韩信点兵算法流程图
  6. 魔兽怀旧服最新服务器人口,魔兽世界怀旧服人口普查最新1月_2021wow怀旧服人口普查数据一览_3DM网游...
  7. Exposure X8 ps人像图片调色滤镜插件
  8. FPS游戏方框透视基本原理
  9. Direct3D透视教程,教你做出属于自己的透视
  10. iOS之healthKit