网络编程入门(代码很详细)

article/2025/9/26 16:54:37

网络编程

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();}

希望对大家有帮助~


http://chatgpt.dhexx.cn/article/SZK1Fbch.shtml

相关文章

网络编程——(1)网络编程入门

一、软件架构 1.1C/S结构: 全称Client/Server结构,是指客户端和服务器结构。常见的程序有QQ、迅雷等。 1.2 B/S结构: 全称为Browser/Server结构,是指浏览器和服务器结构。常见浏览器有谷歌、火狐等。 两种架构各有优势&#xf…

网络编程入门

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

线性代数学习笔记——第六讲——矩阵的转置

1. 矩阵转置的定义(矩阵的行和列互换位置) 2. 矩阵转置的性质之一:矩阵转置一次后再转置一次,等于矩阵自身(有点像一个两状态开关,在开与关之间来回切换) 3. 对称矩阵的充要条件是矩阵转置一次后…

转置矩阵、对称矩阵、反对称矩阵以及向量的反对称矩阵

一、转置矩阵 假设矩阵 A 如下表示: 则其转置矩阵表示为: 二、对称矩阵 若矩阵 B 与其转置矩阵相等,则称矩阵 B 为对称矩阵,如: 三、反对称矩阵 若矩阵 C 与其转置矩阵取负后相等,则称矩阵 C 为反对称矩…

Java编程之转置矩阵

一、题目 利用随机函数产生36个10~30之间的整数给一个6*6的矩阵赋值。 (1)求最大元素,并指出其在矩阵中的所有出现位置; (2)求该矩阵的转置矩阵。 二、实验代码 package fighting; import java.util.Rand…

FPGA 矩阵转置

这里写目录标题 1 功能2 开发环境3 框架4 转置公式5 Simulation第一部分第二部分第三部分 6 Matlab代码产生FIFO数据产生转置矩阵 7 HDL仿真文件顶层文件FIFO顶层文件FIFO读FIFO写RAM顶层文件 8 IP配置FIFORAMROM 9 Reference 1 功能 通过tb读取本地数据保存到FIFO&#xff0c…

MATLAB的转置

小席的碎碎叨:   以前处理的数据通常都是实数矩阵,一直认为MATLAB中的转置可用实现,并没有发现有什么不对。但是,这段时间在做线性调频信号的干扰抑制的仿真,其信号矩阵都是复数矩阵,依然在需要转置的时候…

矩阵转置(transpose、T)

1.T T 适用于一、二维数组的转置 transpose 适用于高维数组,需要用到一个由轴编号组成的元组,才能进行转置 In [1]: import numpy as npIn [2]: arr np.arange(20).reshape(4,5)#生成一个4行5列的数组In [3]: arr Out[3]: array([[ 0, 1, 2, 3, 4]…

线性代数:转置矩阵(matrix transpose)和逆矩阵(matrix inverse)

这一篇是为了后面着色效果的数学基础做积累,之前我们使用矩阵的大部分情况都是直接的仿射空间变换,就是仿射空间A变换到仿射空间B,使用矩阵也都是如下: 矩阵T*齐次坐标V 齐次坐标V 其计算细节也就是矩阵行与向量列的点积&#xf…

转置矩阵(matrix transpose)和逆矩阵(matrix inverse)的相关公式

转载自: https://blog.csdn.net/yinhun2012/article/details/84236202 这一篇是为了后面着色效果的数学基础做积累,之前我们使用矩阵的大部分情况都是直接的仿射空间变换,就是仿射空间A变换到仿射空间B,使用矩阵也都是如下: 矩阵T…

转置矩阵(Transpose of a matrix)

定义 给定一个矩阵 A,将矩阵的行列互换得到的新矩阵称为转置矩阵,记为 ,。转置矩阵的行列式不变,即 。转置矩阵由下列动作建立: 将 A 的横行写为 的纵列;将 A 的纵列写成 的横行。 形式来说&#xff0…

数据结构--3.3 矩阵转置

矩阵转置 结构体创建初始化转置打印测试代码运行结果 1.稀疏矩阵的压缩存储,至少需要存储以下信息: 矩阵中各非 0 元素的值,以及所在矩阵中的行标和列标; 矩阵的总行数和总列数; 上图是一个稀疏矩阵,若对…

D2D与其他短距离通信技术

本篇文章主要对D2D和其他短距离通信技术(WIFI\NFC\zigbee\蓝牙、超宽带、微站)做了比较,从运营商投入、基础设施、应用、最大传输速率、最大传输距离、频率、标准、特征等方面

D2D引擎与GDI\GDI+绘制效果对比

本例主要是对比D2D和GDI在绘制文字、线条的区别,以及D2D与GDI在绘制图片时的区别。 D2D是基于COM组件开发的,使用前的CoInitialize(NULL)是必须的;另外,GDI的初始化GdiplusStartup()也别忘了。 废话少说&…

D2D加载图片资源(2)

※先给大家认识下什么是WIC WIC全称是Windows Image Component,是一套扩展的API,用来处理数字图像,它是基于COM组件的。该API包含非常丰富的图像处理函数。 详细可以点击百度文库再看看 http://baike.baidu.com/view/414115.htm?fraladdi…

5G关键技术,D2D通信-ielab

D2D(device to device)技术是指两个对等的用户节点之间直接进行通信的一种通信方式。在由D2D通信用户组成的分散式网路中,每个用户节点都能发送和接收信号,并具有自动路由(转发消息)的功能。网路的参与者共用它们所拥有的一部分硬…

D2D D3D12 渲染视频帧思路及实现

写在之前 耗时2个月,写完公司的音视频处理系统。对于整个音视频处理有了基本的了解。个人感觉最坑的地方有三: 编解码音视频录制的同步视频预览渲染(视频帧的渲染) 由于在以后要支持同时多路1080P录制及预览,所以对…

车载通信与导航(五):D2D通信流程

取自https://blog.csdn.net/u012159948/article/details/20059927 D2D技术可以应用于移动蜂窝网络,以提高资源利用率和网络容量。每一个D2D通信链路占用的资源与一个蜂窝通信链路占用的相等。D2D通信将在宏蜂窝基站的控制下获得通信所需的频率资源和传输功率。它与蜂…

关于字体绘制的baseline (QT 和 D2D)

常规字体绘制API调用: QT:QPainter::drawText D2D: ID2D1RenderTarget::DrawText 以上字体绘制某些特殊效果无法达到, 我们可以用Path绘制字体: QPainterPath::addText(qreal x, qreal y, const QFont &f, const QString &text); D2D: 将字用指定字体属性绘制好,…

DirectX12(D3D12)基础教程(十三)——D2D、DWrite On D3D12与文字输出

文章目录 1、 前言2、D2D、DWrite简介3、添加D2D、DWrite基础支持文件4、D2D、DWrite基本编程步骤5、基于D3D11On12设备创建D2D渲染目标6、创建DWrite字体用D2D显示文字7、D2D、D3D11on12与D3D12同步 1、 前言 在经过了前面一系列章节的“狂轰滥炸”式的学习之后,如…