Java 网络编程(大全)

article/2025/10/6 7:48:04

前言必读

读者手册(必读)_云边的快乐猫的博客-CSDN博客

一、1网络通信的基本模式分为两种

1.CS模式(Client---客户端,Server---服务端) 

客户端是需要程序员去开发的,例如日常使用的各种的APP,服务端就是服务器。

例子:端游,依赖特定的PC端才能玩。

2.BS模式(Browser---浏览器,Server---服务端)---重点学习

服务端是需要程序员去开发的。浏览器就是我们日常使用的浏览器去访问各种网站,只要有浏览器就可以访问,不依赖特定的PC端,在任意设备上都可以访问网站服务器 。

例子:网页小游戏,联网浏览器就可以玩。 

一、2 请分析C/S和B/S架构相比的各自的优缺点?

1.CS(客户端--服务器结构)

优点 技术成熟,交互性强,网络通信量低,响应数据快。将任务分到了两端,降低了系统的开销。客户端要处理大多数的业务逻辑和UI展示。他是胖客户端。

缺点:更新太快,要求用户有相同的操作系统,如果有不同的操作系统还要开发不同的版本,对于计算机电脑的配置要求也高

2。BS(浏览器-服务器结构)

优点:主要事务在服务端实现。分布性强、维护方便、开发简单

共享性强、总体成本低,对客户端的电脑配置要求较低

缺点:数据安全性问题,对服务器要求高。数据传输速度较慢,软件的个性化明显降低,难以实现传统模式下的特殊功能要求,他是瘦客户端,大量的数据的传输都要通过服务器与浏览器进行交互,通信开销大,难以实现复杂的应用构造

二、实现网络编程的三种要素

IP地址可以理解为具体哪个计算机,端口理解计算机上的程序(一个程序一个端口),协议理解为电脑通过什么方式和外界交互

要素一:IP地址:设备在网络中的地址,是唯一的标识

详解:

(1)常见的IP分类为:

IPv4(32比特4字节)和IPv6(128位16个字节)--称号--可以标记地球上的每一粒沙子。

(2)IP地址的取经之路:

计算机:我要去找百度获取数据。

DNS服务器:发过来我看看哪个网址域名啊,给你指路具体的ip地址

计算机:知道了这个ip地址,我就可以去找具体要访问的服务器了

服务器:计算机老弟你来找我了啊,那我把你要的数据发给你吧。 

(3)公网地址和私有地址(局域网使用)

192.168开头的就是常见的私有地址 

(4)获取IP地址的代码

 要去实现这个IP地址的获取就要用到 InetAddress方法

代码例子:

package bao;import java.net.InetAddress;public class Test {public static void main(String[] args) throws Exception {//1.获取本机地址ip对象InetAddress ip1 = InetAddress.getLocalHost();System.out.println(ip1.getHostName());//获取主机名字System.out.println(ip1.getHostAddress());//获取ip地址//2.获取域名ip对象InetAddress ip2 = InetAddress.getByName("www.baidu.com");System.out.println(ip2.getHostName());//获取域名System.out.println(ip2.getHostAddress());//获取域名的ip地址//3.获取公网对象InetAddress ip3 = InetAddress.getByName("112.80.248.76");System.out.println(ip3.getHostName());//获取公网名字System.out.println(ip3.getHostAddress());//获取公网ip地址//判断网络是否能连接通信 ping 5s之前测试是否能通过System.out.println(ip3.isReachable(5000));//通过会返回true}
}

运行结果:

涉及到个人隐私就不放到这里来了,可以自己运行试试看  

 =========================================================================

要素二:端口:应用程序在设备中的唯一标识

一个主机设备中,端口号是唯一的

(1)端口号:一个程序一个端口号,被规定为16位的二进制,范围是0~65535

(2)周知端口:0~1023,被预先定义的知名应用占用。(例如:HTTP占用80端口,FTP占用21端口)

(3)注册端口:1024~49151,分配给用户进程或某些程序(例如:Tomcat占用8080端口)

(4)动态端口:49152~65535,不固定分配到某种进程,动态分配

 =========================================================================

要素三:协议:数据在网络中的传输协议,最常见的有UDP和TCP(重点)

(1)TCP协议: (安全,有连接确认可靠)

使用TCP协议,双方必须先建立连接,它是一种面向连接可靠通信协议,传输前,要建立三次握手方式建立连接确认。连接和发送数据都需要确认。传输完成后,还需要释放已连接的通信,通信效率相对比较低。

使用场景:对安全需求较高的文件下载、金融数据通信等。

三次握手连接:

客户端:在吗?

服务端:在

客户端:上号

四次握手断开连接:

客户端:不玩了

服务端:好吧

服务端:下次什么时候玩?

客户端:有空再玩 

例子:

一收一发

发送端(客户端) 

package bao;import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;//发送端
public class Test {public static void main(String[] args) throws IOException {System.out.println("==============客户端启动===============");//1.创建发送通信管道Socket socket = new Socket("127.0.0.1",7777);//参数一:服务端地址 参数二:服务端端口//2.从scoket管道中获得一个字节输出流,负责发送数据OutputStream os = socket.getOutputStream();//3.字节流升级成打印流PrintStream ps = new PrintStream(os);//4.发送消息ps.println("大哥,我来了");ps.flush();//刷新}
}

 接收端 (服务端)

package bao;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;//服务端
public class Test1 {public static void main(String[] args) throws IOException {System.out.println("========服务端启动============");//1.创建接收管道,注册端口ServerSocket serverSocket = new ServerSocket(7777);//参数一:定义服务端口//2.等待管道连接Socket accept = serverSocket.accept();//3.从管道中获取一个字节输入流InputStream is = accept.getInputStream();//4.字节流升级生缓冲输入流BufferedReader br = new BufferedReader(new InputStreamReader(is));//5.按照行读取消息会更好String a;if ((a = br.readLine())!=null){System.out.println(accept.getRemoteSocketAddress()+"说了:"+a);}}
}

 运行结果:

/127.0.0.1:60316说了:大哥,我来了

 ==============客户端启动===============

多收多发 

发送端(客户端) 

package bao;import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;public class kehu {public static void main(String[] args) throws Exception {System.out.println("客户端启动");//1.创建与服务端连接的管道Socket s = new Socket(InetAddress.getLocalHost(), 9966);//2.创建一个线程负责客户端的消息读取new ClientReaderThread(s).start();//3.创建一个字节输入流管道OutputStream o = s.getOutputStream();PrintStream p = new PrintStream(o);//升级流//4.客户端输入数据Scanner sc = new Scanner(System.in);while (true){System.out.println("请输入:");String s1 = sc.nextLine();p.println(s1);//发送数据出去p.flush();//刷新流}}
}
class ClientReaderThread extends Thread{private Socket socket;public ClientReaderThread(Socket socket){this.socket = socket;}@Overridepublic void run(){try {//把字节输入流包装成字符输入流InputStream i = socket.getInputStream();BufferedReader b = new BufferedReader(new InputStreamReader(i));String s1;while (true){if ((s1=b.readLine())!=null){System.out.println("收到了消息"+s1);}}} catch (IOException e) {System.out.println("服务器把你提出群聊");}}}

  接收端 (服务端)

package bao;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;public class fuwu {//1.定义一个静态变量储存全部管道public static List<Socket> all_Sockets = new ArrayList<>();public static void main(String[] args) throws IOException {System.out.println("服务端启动成功");//2.服务端口注册ServerSocket ss = new ServerSocket(9966);//3.管道死循环设置while (true){Socket s = ss.accept();System.out.println(s.getRemoteSocketAddress()+"上线了");all_Sockets.add(s);new fuwuThread(s).start();}}
}
class fuwuThread extends Thread{private Socket socket;public fuwuThread(Socket socket){this.socket=socket;}@Overridepublic void run(){try {InputStream i = socket.getInputStream();BufferedReader b = new BufferedReader(new InputStreamReader(i));String s1;while ((s1=b.readLine())!=null){System.out.println(socket.getRemoteSocketAddress()+"说"+s1);sendMessage(s1);}} catch (IOException e) {System.out.println(socket.getRemoteSocketAddress()+"离线了");fuwu.all_Sockets.remove(socket);}}private void sendMessage (String s1) throws IOException {for (Socket s:fuwu.all_Sockets){OutputStream o = s.getOutputStream();PrintStream p = new PrintStream(o);p.println(s1);p.flush();}}
}

运行结果:

服务端启动成功
/192.168.78.1:56384上线了
/192.168.78.1:56384说大哥
/192.168.78.1:56389上线了
/192.168.78.1:56389说小弟
/192.168.78.1:56384说
/192.168.78.1:56384说大哥11

客户端启动
请输入:
大哥
请输入:
收到了消息大哥
收到了消息小弟

大哥11
请输入:
请输入:
收到了消息
收到了消息大哥11

客户端启动
请输入:
小弟
请输入:
收到了消息小弟
收到了消息
收到了消息大哥11 

 =========================================================================

                                                            TCP和UDP的分界线

 =========================================================================

(2)UDP协议:(速度快,无连接,不可靠)

不需要建立连接(因为把数据源IP、目的地IP、端口封装成数据包),每个数据包在64KB内,只管发,不管对方有没有接到确认什么的。

优点:可以广播发送,发送数据结束时无需释放资源,开销小,速度快。

使用场景:语言通话、视频通话等。

ps:这个就是一股脑的什么都封装一起,直接往外抛就什么都不管了,当然快了。

例子:

一收一发

发送端(客户端)

package bao;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class Test {public static void main(String[] args) throws Exception {//一、发送端(测试时候先启动接收再发送端)//1.创建发送端对象,发送端自带默认端口号(人)System.out.println("========客户端启动============");DatagramSocket socket1 = new DatagramSocket();//不定义就默认端口//2.创建一个要发送的数据容器(容器里面有数据)byte[] a ="我是水".getBytes();//3.创建一个数据包对象把容器装起来DatagramPacket packet1 = new DatagramPacket(a,a.length, InetAddress.getLocalHost(),8899);//数据,大小,服务端的IP,服务端的端口//4.发送出去socket1.send(packet1);//5.关闭资源,避免资源浪费socket1.close();}
}

接收端 (服务端)

package bao;import java.net.DatagramPacket;
import java.net.DatagramSocket;public class Test1 {public static void main(String[] args) throws Exception {//二、接收端(测试时候先启动接收再发送端)//1.创建接收端对象,注册端口(人)System.out.println("=========接收端启动===============");DatagramSocket socket2 = new DatagramSocket(8899);//2.创建一个要接收的数据容器(等待接收数据)byte[]b =new byte[1024*64];//3.把容器数据打包DatagramPacket packet2 = new DatagramPacket(b,b.length);//4.等待接收数据socket2.receive(packet2);//5.读取多少倒出多少int len = packet2.getLength();String rs = new String(b,0,len);System.out.println("接收到了数据了"+rs);//6.关闭资源,避免资源浪费socket2.close();}
}
//额外知识点,获取对方端口和ip地址
//String ip = packet2.getAddress().toString();
//System.out.println("对方IP地址为"+ip);//int port = packet2.getPort();
//System.out.println("对方端口位置"+port);

运行结果:

========客户端启动============ 

=========接收端启动===============
接收到了数据了我是水 

多收多发

思想:把一收一发代码拿来改进就好了

发送端:把主要发送的代码写入死循环并写一个键盘输入代码,只有用户输入exit才能退出循环。

接收端:把等待接收的封装包开始写入死循环里面,然后再把释放资源的代码注释掉才能一直接收

发送端(客户端)

package bao;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
//发送端
public class Test {public static void main(String[] args) throws Exception {//一、1.创建发送端对象,发送端自带默认端口号(人)DatagramSocket socket1 = new DatagramSocket();//不定义就默认端口System.out.println("========客户端启动============");//二.6创建键盘录入Scanner sc = new Scanner(System.in);while (true) {//二、5.死循环把代码封起来(多收多发步骤)//二、6.接收键盘录入System.out.println("请输入:");String msg = sc.nextLine();//二、7.设置exit退出if ("exit".equals(msg)){System.out.println("离线成功");socket1.close();//释放资源break;}//2.创建一个要发送的数据容器(容器里面有数据)byte[] a =msg.getBytes();//3.创建一个数据包对象把容器装起来DatagramPacket packet1 = new DatagramPacket(a,a.length, InetAddress.getLocalHost(),8899);//数据,大小,服务端的IP,服务端的端口//4.发送出去socket1.send(packet1);}}
}

接收端 (服务端)

package bao;import java.net.DatagramPacket;
import java.net.DatagramSocket;
//二、接收端
public class Test1 {public static void main(String[] args) throws Exception {//1.创建接收端对象,注册端口(人)System.out.println("=========接收端启动===============");DatagramSocket socket2 = new DatagramSocket(8899);//2.创建一个要接收的数据容器(等待接收数据)byte[]b =new byte[1024*64];//3.把容器数据打包DatagramPacket packet2 = new DatagramPacket(b,b.length);while (true) {//二、6.把封装代码写入死循环并删掉释放资源的代码(多收多发步骤)//4.等待接收数据socket2.receive(packet2);//5.读取多少倒出多少int len = packet2.getLength();String rs = new String(b,0,len);System.out.println("接收到了来自:"+packet2.getAddress()+"对方端口是:"+packet2.getPort()+rs);}}
}
//额外知识点,获取对方端口和ip地址
//String ip = packet2.getAddress().toString();
//System.out.println("对方IP地址为"+ip);//int port = packet2.getPort();
//System.out.println("对方端口位置"+port);

运行结果: 

========客户端启动============
请输入:
你在吗
请输入:
在干嘛
请输入: 

=========接收端启动===============
接收到了来自:(隐私不展示)对方端口是:(隐私不展示)你在吗
接收到了来自:(隐私不展示)对方端口是:(隐私不展示)在干嘛

多开客户端 步骤

一台主机中可以创建很多个客户端给接收端发消息 

 1.在客户端的页面右上角点击

2.找到Allow multiple instances勾选完成

 广播(当前主机和所在网络中的所有主机通信)

步骤:(前提在同一网段内)

发送端的参数地址指定为255.255.255.255,并且指定端口:例如6666

接收端的参数端口只要匹配成功就可以了,例如:6666

例子:

发送端

//修改前//3.创建一个数据包对象把容器装起来
DatagramPacket packet1 = new DatagramPacket(a,a.length, InetAddress.getLocalHost(),8899);//数据,大小,服务端的IP,服务端的端口//修改后//3.创建一个数据包对象把容器装起来
DatagramPacket packet1 = new DatagramPacket(a,a.length, InetAddress.getByName("255.255.255.255"),6666);//数据,大小,服务端的IP,服务端的端口

 接收端

//修改前//1.创建接收端对象,注册端口(人)
System.out.println("=========接收端启动===============");
DatagramSocket socket2 = new DatagramSocket(8899);//修改后//1.创建接收端对象,注册端口(人)
System.out.println("=========接收端启动===============");
DatagramSocket socket2 = new DatagramSocket(6666);

组播 (当前主机和所在网络中的一组主机通信)

发送端和接收端都要用MulticastSocket绑定同一个IP地址和绑定同一个端口

范围:224.0.0.0~~~~239.255.255.255

发送端

//修改前//3.创建一个数据包对象把容器装起来
DatagramPacket packet1 = new DatagramPacket(a,a.length, InetAddress.getByName("255.255.255.255"),6666);//数据,大小,服务端的IP,服务端的端口//修改后//3.创建一个数据包对象把容器装起来
DatagramPacket packet1 = new DatagramPacket(a,a.length, InetAddress.getByName("224.0.1.1"),6666);//数据,大小,服务端的IP,服务端的端口

接收端

//修改前//1.创建接收端对象,注册端口(人)
System.out.println("=========接收端启动===============");
DatagramSocket socket2 = new DatagramSocket(6666);//修改后//1.创建接收端对象,注册端口(人)
System.out.println("=========接收端启动===============");
MulticastSocket socket2 = new MulticastSocket(6666);
//绑定组播IP(JDK开始过时的API)
socket2.joinGroup(InetAddress.getByName("224.0.1.1"));

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

相关文章

java游戏编程:三路兵线,BOSS走位,代码和视频

一、基本功能&#xff1a; 坦克大战&#xff1a;三路兵线的走&#xff0c;停&#xff0c;走&#xff0c;停。四个版本的飞机大战&#xff1a;多种运动方式。都有代码和视频下载地址。 二、后续改进&#xff1a; 走&#xff0c;停发起攻击&#xff0c;走&#xff0c;停发起攻击…

Java实现石头剪刀布游戏

思路&#xff1a;采取5局3胜制&#xff1b;用两个变量a、b标记&#xff0c;若&#xff0c;第一局电脑胜&#xff0c;则b加1&#xff0c;反之亦然。其中用到int randomNumber new Random().nextInt(4) 随机生成04的一个数&#xff0c;通过生成的数索引数组中的内容&#xff0c;…

Java实现猜数游戏

1 问题 编写一个Java程序&#xff0c;实现以下功能&#xff1a; 2 方法 首先导入java.util包下的Random&#xff0c;让程序随便分配给用户一个数。 再导入java.util包下的Scanner类&#xff0c;构建Scanner对象&#xff0c;以便输入。 利用Random().nextInt()生成一个随机的i…

Java小游戏:飞翔的小鸟 【附源码和素材】

目录 一、项目分析 二、项目展示 1.开始状态 2.运行状态 3.结束状态 三、实现代码 1.游戏启动类 2.地面类 3.小鸟类 4.柱子类 四、代码资源 一、项目分析 创建一个窗口和画板&#xff0c;把画板放到窗口上&#xff0c;在画板上绘画图片 &#xff08;2&#xff09;让小鸟…

Java——猜数字游戏

目录 &#x1f351;前置知识 &#x1f351;题目要求 &#x1f351;代码实现 &#x1f351;测试 &#x1f351;前置知识 既然是猜数字那么就要生成一个随机数 在Java中要生成一个指定范围之内的随机数字有两种方法&#xff1a;一种是调用 Math 类的 random() 方法&…

Java简单实现猜拳游戏

前言 Random类的简单使用 .nextInt()方法&#xff0c;返回伪随机的&#xff0c;均匀分布 int值介于0&#xff08;含&#xff09;和指定值&#xff08;不包括&#xff09;&#xff0c;从该随机数生成器的序列绘制。 public class Demo_02 {//出拳游戏:1表示石头,2表示剪刀,3表…

java实现猜拳游戏

剪刀、石头、布又称“猜丁壳”&#xff0c;古老而简单&#xff0c;这个游戏的主要目的是为了解决争议&#xff0c;因为三者相互制约&#xff0c;因此不论平局几次&#xff0c;总会有胜负的时候。 游戏规则中&#xff0c;石头克剪刀&#xff0c;剪刀克布&#xff0c;布克石头。…

Java游戏编程前篇 修改eclipse背景颜色

最近准备开始研究java游戏设计了。&#xff08;不是安卓的游戏设计&#xff0c;关于安卓的游戏设计&#xff0c;我打算学完java之后直接学cocos2dx&#xff0c;学习java的原因是因为在公司里接触到了eclipse&#xff0c;所以打算顺便将java也啃下来&#xff0c;以后说不定哪天就…

java游戏开发入门(一) - HelloWorld

java游戏开发入门&#xff08;一&#xff09;- HelloWorld 前言开发环境启程 Hello WorldMaven启动类 HelloWorldApp创建一个600 x 600&#xff0c;标题为"Hello world"的窗体main运行效果完整代码 完整项目 前言 开发一款游戏&#xff0c;我相信很多人在学习开发之前…

JAVA编程实现猜数游戏

1.该程序就是随机生成一个1-100的整数让玩家进行游戏&#xff0c;不限次数&#xff0c;直到玩家猜对为止。 2.使用while循环语句实现功能 3.代码展示 import java.util.Random; import java.util.Scanner;public class S11 {public static void main(String[] args) {Random…

Java游戏框架编写

自己抽空编写的一个2D游戏框架(也可以说是工具类集吧)&#xff0c;在此记录一下&#xff0c;开发完了顺便写了一个案例判断框架的可用性 项目地址&#xff1a;https://gitee.com/shaokang123/spring-game-starter 框架特点 支持直接使用Tiled设计地图&#xff0c;以name为beanN…

Java游戏编程——愤怒的小鸟(一)

Java游戏编程——愤怒的小鸟&#xff08;一&#xff09; 前言&#xff1a;最近在b站up主尚学堂杨老师&#xff08;b站链接&#xff09;学习了我做的第一个游戏项目&#xff0c;所以在csdn进行总结&#xff0c;便于今后查看。 本部分主要是将游戏的背景绘制出来 先上一张效果…

java游戏开发(java游戏开发教程)

Java游戏开发绘图器是什么呢&#xff1f; 众所周知&#xff0c;Java GUI以paint进行绘图&#xff0c;以repaint进行图像刷新&#xff0c;而完成repaint及paint这一连贯过程中所用到绘图组件&#xff0c;我将其称为绘图器。就我个人的体会&#xff0c;绘图器的调用时机应始终处于…

Java编程实现三种等级的扫雷游戏(完整版)

大家好&#xff0c;我是陈橘又青&#xff0c;今天用Java编程实现图形化界面的扫雷游戏&#xff08;三种难度&#xff09;&#xff0c;以下是完整的开发思路以及代码&#xff0c;供各位讨论交流。 文章目录 一、效果展示初级难度中级难度高级难度测试界面 二、项目介绍项目背景功…

Java游戏编程初步

现在流行的游戏似乎都是用C或C来开发的。在java平台上几乎没有很大型及可玩的流行游戏。由于java是个新生语言&#xff0c;他的许多特性还有待大家的发掘,但是我们不能否认Java在游戏编程方面的强大性。本文将带领大家一步一步学习编写Java游戏。最终打造属于自己的Java游戏。 …

如何用java语言编写小游戏?(一)

学习java的过程中&#xff0c;如果想找一些小游戏项目来练手的话&#xff0c;我们需要学习哪些技术先呢&#xff1f;&#xff08;适用于java初学者&#xff09; 第一步&#xff1a;了解GUI编程—Swing基础 GUI&#xff08;Graphical User interface&#xff09;&#xff1a; …

SQL编程篇

SQL编程篇 这是以前的学习总结&#xff1a; 这一周将SQL编程篇仔细地看了一遍&#xff0c;有不少感触&#xff0c;因为SQL Server 中的T-SQL语言&#xff0c;在某种程度上就类似C等编程语言&#xff0c;其中有基本运算、控制语句及函数还有一个叫存储过程的东东。但目前对他们在…

SQL语言

创建数据库 创建table&#xff0c;create table后可以"库名.表名"或者"库名.用户.表名"&#xff0c;也可以用上面工具选择&#xff0c;如果名字中含有特殊关键字&#xff0c;mysql需要交,sql server需要加[] 创建表 CREATE TABLE Student (S# CHAR ( 8 …

mysql -sql编程

基础语句 # 创建库 create database dome; # 切换到数据库 use dome; # 创建表 create table z (a int unsigned); # 查看表show create table z; # 查看表结构 desc z; # 插入数据 insert into z value(1);# 修改表字段类型 alter table zz change column a a int auto_incre…

pl/SQL编程基础

一、PL/SQL编程基础 1、pl/sql的组成&#xff1a;声明块、执行块、异常处理块 2、编制代码实现12...100的计算 3、编写求u12...100的结果并显示的存储过程 4、编写求12...n的带参数的存储过程 三、函数编程 1、函数的概念 function函数,存储在数据库中的带返回值的命名pl/s…