网络编程

    科技2026-04-25  13

    网络编程

    1.1、概述

    计算机网络:

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

    网络编程的目的:

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

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

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

    找到了这个主机进行数据传输。

    1.2、网络通信要素

    通信:通信双方的地址

    ip地址

    端口号

    规则:网络通信协议:TCP/IP协议 TCP UDP

    小结:

    网络编程的两个主要问题

    如何准确定位到网络上的一台或者多台主机找到主机后如何进行通信

    网络编程中的要素

    IP和端口号 IP类网络通信协议:UDP,TCP类

    万物皆对象

    1.3、IP

    ip地址:InetAddress

    唯一定位一台网络上计算器127.0.0.1:本机Iocalhostip地址的分类 ipv4/ipv6 IPV4 127.0.0.1 ,四个字节组成IPV6 ,: 128位,8个无符号整数

    公网(互联网)-私网(局域网)

    package ip; import java.net.InetAddress; import java.net.UnknownHostException; public class TestInetAddress { 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); //查询网络ip地址 InetAddress inetAddress2 = InetAddress.getByName("www.baidu,com"); System.out.println(inetAddress2); } catch (UnknownHostException e) { e.printStackTrace(); } } }

    1.4、端口

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

    不同的进程有不同的端口号,且只有一个,用来区分软件

    端口被规定0~65535

    TCP,UDP :0~65535单个协议下不能冲突

    端口分类

    共有端口0~1023

    http:80https:443ftp:21telent:23

    程序注册端口:1024~49151,分配用户或者程序

    Tomcat:8080MySQL:3306Oracle:1521

    动态端口,私有端口:49152~65535

    查看所有端口:netstat -ano

    netstat -ano|findstr “5900”

    package ip; import java.net.InetSocketAddress; public class TestInetSocketAddress { public static void main(String[] args) { InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1",8080); InetSocketAddress socketAddress2 = new InetSocketAddress("localhost",8080); System.out.println(socketAddress); System.out.println(socketAddress2); System.out.println(socketAddress.getAddress()); System.out.println(socketAddress.getHostName()); System.out.println(socketAddress.getPort()); }

    1.5、通信协议

    协议:双方的约定

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

    分层

    TCP/IP协议

    TCP:用户传输协议

    UDP:用户数据协议

    IP:网络互连协议

    TCP和UDP协议对比

    TCP:打电话

    连接,稳定三次握手,四次挥手 最少需要三次,保证稳定连接! A:你瞅啥? B:瞅你咋滴? A:干一架! A:我要离开了了 B:我知道你要离开了 B:你真的要离开了吗? A:我真的要离开了 客户端,服务端传输完成,释放连接,效率低

    UDP:发短信

    不连接,不稳定客户端,服务端:没有明确的界限不管是否准备完成,都可以发送给你DDOS:洪水攻击,饱和攻击

    1.6、TCP

    客户端

    连接服务器 Socket发送消息

    服务器

    建立服务的端口 ServerSocket等待用户的连接接收消息

    文件上传

    客户端

    package ip.lesson02; import java.io.*; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; public class TcpClientDemo02 { public static void main(String[] args) throws IOException { //1.创建一个Socket连接 Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000); //2,创建一个输出流 OutputStream os = socket.getOutputStream(); //3,文件流 FileInputStream fis = new FileInputStream(new File("193714.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[2014]; int len2; while ((len2=inputStream.read(buffer2))!=-1){ baos.write(buffer2,0,len2); } //5,关闭资源 baos.close(); inputStream.close(); fis.close(); os.close(); socket.close(); } }

    服务器端

    package ip.lesson02; import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class TcpServerDemo02 { public static void main(String[] args) throws IOException { //创建服务 ServerSocket serverSocket = new ServerSocket(9000); //监听客户端的连接 Socket socket = serverSocket.accept();//阻塞式监听,会一直等待客户端连接 //获取输入流 InputStream is = socket.getInputStream(); //文件输出 FileOutputStream fos = new FileOutputStream(new File("receiver.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("我接受完毕了,你可以断开".getBytes()); //关闭资源 fos.close(); is.close(); socket.close(); serverSocket.close(); } }

    Tomcat

    服务端:Tomcat S端:java后端开发

    客户端:浏览器

    1.7、UDP

    发短信不用链接,需要知道对方地址

    发送消息

    package ip.lesson03; import java.io.IOException; import java.net.*; //不需要连接服务器 public class UdpClientDemo01 { public static void main(String[] args) throws IOException { //1,建立一个Socket DatagramSocket socket = new DatagramSocket(); //2,建一个包 String msg = "你好啊!服务器"; //发送对象 InetAddress localhost = InetAddress.getByName("localhost"); int port = 9090; DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port); //3,发送包 socket.send(packet); //4,关闭 socket.close(); } }

    接收端

    package ip.lesson03; import java.io.IOException; import java.net.*; //不需要连接服务器 public class UdpClientDemo01 { public static void main(String[] args) throws IOException { //1,建立一个Socket DatagramSocket socket = new DatagramSocket(); //2,建一个包 String msg = "你好啊!服务器"; //发送对象 InetAddress localhost = InetAddress.getByName("localhost"); int port = 9090; DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port); //3,发送包 socket.send(packet); //4,关闭 socket.close(); } } package ip.lesson03; import java.io.IOException; import java.net.*; //不需要连接服务器 public class UdpClientDemo01 { public static void main(String[] args) throws IOException { //1,建立一个Socket DatagramSocket socket = new DatagramSocket(); //2,建一个包 String msg = "你好啊!服务器"; //发送对象 InetAddress localhost = InetAddress.getByName("localhost"); int port = 9090; DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port); //3,发送包 socket.send(packet); //4,关闭 socket.close(); } } package ip.lesson03; import java.io.IOException; import java.net.*; //不需要连接服务器 public class UdpClientDemo01 { public static void main(String[] args) throws IOException { //1,建立一个Socket DatagramSocket socket = new DatagramSocket(); //2,建一个包 String msg = "你好啊!服务器"; //发送对象 InetAddress localhost = InetAddress.getByName("localhost"); int port = 9090; DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port); //3,发送包 socket.send(packet); //4,关闭 socket.close(); } }

    控制台在线咨询

    package ip.chat; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; public class TalkSend implements Runnable{ DatagramSocket socket = null; BufferedReader reader = null; private int formIP; private String toIP; private int toPort; public TalkSend(int formIP, String toIP, int toPort) { this.formIP = formIP; this.toIP = toIP; this.toPort = toPort; try { socket = new DatagramSocket(); reader = new BufferedReader(new InputStreamReader(System.in)); }catch (Exception e){ e.printStackTrace(); } } @Override public void run() { while (true){ try { String data = reader.readLine(); byte[] datas = data.getBytes(); DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress(this.toIP, this.toPort)); socket.send(packet); if (data.equals("bye")){ break; } }catch (Exception e){ e.printStackTrace(); } } //关闭 socket.close(); } } package ip.chat; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class TalkReceive implements Runnable{ DatagramSocket socket = null; private int port; //设置消息来源 private String msgFrom; public TalkReceive(int port ,String msgFrom) { this.port = port; this.msgFrom = msgFrom; try { socket = new DatagramSocket(port); } catch (SocketException e) { e.printStackTrace(); } } @Override public 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 receiveData = new String(data, 0, data.length); System.out.println(msgFrom+":"+receiveData); if (receiveData.equals("bye")){ break; } } catch (IOException e) { e.printStackTrace(); } } socket.close(); } } package ip.chat; public class TalkStudent { public static void main(String[] args) { //开启两个线程 new Thread(new TalkSend(7777,"localhost",9999)).start(); new Thread(new TalkReceive(8888,"老师")).start(); } } package ip.chat; public class TalkTeacher { public static void main(String[] args) { new Thread(new TalkSend(5555,"localhost",8888)).start(); new Thread(new TalkReceive(9999,"学生")).start(); } }

    1.8、URL

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

    DNS:域名解析

    协议://ip地址(一般是域名,通过DNS解析):端口/项目名/资源

    根据url下载网络资源

    下载先要打开tomcat,然后本代码中下载的是本地已经有了的资源,还可以通过此代码下载各种网络资源(图片,音乐),修改相应的url即可

    package ip.lesson04; import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; public class urlDown { public static void main(String[] args) throws Exception { //1,下载地址 URL url = new URL("http://localhost:8080/zzj/SecurityFile.txt");//下载的地址 //2,连接到这个资源 HTTP HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); InputStream inputStream = urlConnection.getInputStream(); FileOutputStream fos = new FileOutputStream("SecurityFile.txt");//相应下载的名称 //文件 byte[] buffer = new byte[1024]; int len; while ((len=inputStream.read(buffer))!=-1){ fos.write(buffer,0,len); } //关闭资源 fos.close(); inputStream.close(); urlConnection.disconnect(); } }
    Processed: 0.012, SQL: 9