13、网络编程
网络编程
网络底层
网络模型一
网络模型二
IP ,端口号,通信协议
IP: 识别一台计算机的,只要是为了找到某一台,所有IP地址不能够重复。
由4个8位二进制的组成,也就是32位的二进制,分成4部分。
比如说 192.168.3.42 ------》 在计算机显示的是十进制,计算机运行的是二进制。
IP 地址:32位,由4个8位二进制数组成
IP表示方法:点分十进制
IP地址 = 网络ID +主机ID
网络ID:标识计算机或网络设备所在的网段
主机ID:标识特定主机或网络设备
序号 | 方法 | 描述 |
---|---|---|
1 | public static InetAddress getLocalHost() | 获得主机名和IP地址 |
2 | public String getHostAddress() | 获取IP地址 |
3 | public String getHostName() | 获取主机名 |
4 | public static InetAddress getByName(String host) | 根据主机名获得IP地址 |
获得百度的IP地址:
InetAddress ia2=InetAddress.getByName("www.baidu.com");
System.out.println("其它主机名称:"+ia2.getHostAddress());
端口号:当你识别了一台计算机,但你却不能识别到每一个应用程序在执行什么。所以端口号就是识别应用程序在 电脑的运行,这样就可以找到指定的应用了。
通信协议:当有了IP,端口号,这样就可以找到指定的软件了,但是我们还不知道通过什么东西来传输数据。所以就有了通信协议,这样就可以通过通信协议来传输数据了。通信协议有两种 TCP 和 UDP 。
TCP
先要建立连接然后才能传输数据。
重要的代码。
ServerSocket server = new ServerSocket(8080);//创建服务器,8080是指定接收客户端端口号
//连接到客户端
Socket client = server.accept();
//接收客户端的信息
InputStream is = client.getInputStream();
//创建客户端并指定ip地址,还有服务端端口号
Socket client = new Socket("192.168.3.40",8080);
//从客户端写出信息
OutputStream os = client.getOutputStream();
//提交信息,切断输出流。 client
client.shutdownOutput();
package socket; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) throws IOException { //创建服务器,并指定接收的端口号 ServerSocket server = new ServerSocket(8080); //连接到客户端 Socket client = server.accept(); //接收客户端的信息 InputStream is = client.getInputStream(); byte[] bs = new byte[1024]; int len = is.read(bs); System.out.println(new String(bs,0,len)); is.close(); server.close(); } }
package socket; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; public class Client { public static void main(String[] args) throws IOException { //创建客户端并指定ip地址,还有服务端端口号 Socket client = new Socket("192.168.3.40",8080); //从客户端写出信息 OutputStream os = client.getOutputStream(); os.write("System.out.println('HolleWorld');".getBytes()); //提交信息,切断输出流。 client client.shutdownOutput(); os.close(); client.close(); } }
线程和网络编程
当我们耗时比较就的操作时,比如查询数据库。我们不可能等一个用户查询完再给下一个用户去用,如果是这样的话,我们就执行一个简单的操作,如果用户多,用户就在那里等了好久。这样的体验就极差,所以,我们还是创建一个线程让线程替我们去工作,所以等待的时间就大大的减少了。
package tcpthread02; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class ServerDemo02 { public static void main(String[] args) throws IOException, ClassNotFoundException { ServerSocket server = new ServerSocket(9898); while(true) { Socket client = server.accept(); new MyThread(client).start(); } } }
package tcpthread02; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; public class ClientDemo02 { public static void main(String[] args) throws UnknownHostException, IOException { for (int i = 0; i < 10; i++) { Socket client = new Socket("Localhost",9898); OutputStream os = client.getOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(os); oos.writeObject(new User("张三","123")); client.shutdownOutput(); oos.close(); os.close(); client.close(); } } }
package tcpthread02; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.net.Socket; public class MyThread extends Thread{ private Socket client; public MyThread(Socket client) { super(); this.client = client; } @Override public void run() { InputStream is; try { Thread.sleep(5000); is = client.getInputStream(); ObjectInputStream ois = new ObjectInputStream(is); Object obj = ois.readObject(); System.out.println(obj.getClass().getName()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
package tcpthread02; import java.io.Serializable; public class User implements Serializable{ private String name; private String psw; public User() { super(); // TODO Auto-generated constructor stub } public User(String name, String psw) { super(); this.name = name; this.psw = psw; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPsw() { return psw; } public void setPsw(String psw) { this.psw = psw; } }
服务器和客户端
数据的传输都是相对而言的,输入和输出都是相对于当前的应用程序。
UDP
udp传输协议,是发一段一段数据包这样子,类是于发短信,每次最多只能发这么大的数据,60K的数据。
也能会存在丢包的情况,导致数据的不完整。如果在接收端还没运行,就先运行了发送端。发送端也可以接收数据。
package udp; /** *发送端 */ import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class Send { public static void main(String[] args) throws IOException { //创建发送端,建立自己的端口, DatagramSocket ds = new DatagramSocket(8000); //创建发送的内容 String str = "在吗"; byte[] bs = str.getBytes(); //创建发送包 DatagramPacket dp = new DatagramPacket(bs,bs.length,InetAddress.getLocalHost(),9999); //发送 ds.send(dp); //关闭 ds.close(); } } package udp; /** *接收端 */ import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class Receive { public static void main(String[] args) throws IOException { //创建接收端,建立接收端口号 DatagramSocket ds = new DatagramSocket(9999); //创建接收包 byte[] bs = new byte[1024]; DatagramPacket dp = new DatagramPacket(bs,bs.length); //接收包 ds.receive(dp); //解析包 System.out.println(new String (dp.getData())); System.out.println(dp.getAddress()); ds.close(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!