java网络编程小白教程
1 网络编程
1.1 网络
把多台终端(计算机)通过物理线路连接起来,形成网络。便于交换数据、共享信息、组成更强大的逻辑体。
1.1.1 网络通信三要素
【1】IP地址:唯一标识网络上的每一台计算机
两台计算机之间通信的必备有素
【2】端口号:计算机中应用的标号(代表一个应用程序)
0-1024系统使用或保留端口 ,
有效端口0-65536
常见的端口http协议80端口、mysql(3306) oracle(1521)
【3】通信协议:通信的规则
TCP,UDP
1.1.2 TCP/IP参考模型
1.1.3 IP地址分类
127.0.0.1 表示本机IP地址
1.2 InetAddress
表示IP地址信息
|
package cn.net01; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; public class Test02 { public static void main(String[] args) throws UnknownHostException { // 通过IP地址构建InetAddress对象 byte[] ip = new byte[] {(byte) 192,(byte) 168,7,(byte)189}; InetAddress ip1 = InetAddress.getByAddress(ip); System.out.println(ip1.toString()); System.out.println(ip1.getHostName()); System.out.println(ip1.getHostAddress()); // 给定名称www.baidu.com 获取地址 InetAddress ip3 = InetAddress.getByName("www.baidu.com"); System.out.println(ip3.toString()); InetAddress[] ips = InetAddress.getAllByName("www.baidu.com"); System.out.println(Arrays.toString(ips)); } } |
1.3 TCP编程(A)
案例:服务器向客户端完成一次单向通信
|
package cn.net02; import java.io.IOException; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Server01 { public static void main(String[] args){ System.out.println("server running...."); // 【1】创建serversocket ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(8000); } catch (IOException e) { e.printStackTrace(); } // 【2】等待客户端链入 Socket clientSocket = null; try { // accept 阻塞式方法 clientSocket = serverSocket.accept(); System.out.println("客户端"+clientSocket.getInetAddress().getHostAddress()+"链入"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 【3】服务器给客户端发信息 OutputStream out = null; try { out = clientSocket.getOutputStream(); String msg = "hello!"; byte[] buf = msg.getBytes(); out.write(buf); clientSocket.shutdownOutput(); out.close(); } catch (IOException e) { e.printStackTrace(); } } } |
|
package cn.net02; import java.io.IOException; import java.io.InputStream; import java.net.Socket; import java.net.UnknownHostException; import com.sun.org.apache.bcel.internal.generic.NEW; public class Client01 { public static void main(String[] args) { System.out.println("client running..."); // 【1】创建客户端socket Socket socket=null; try { socket = new Socket("192.168.7.194",8000); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // 【2】接收服务器发来的信息 InputStream in = null; try { in = socket.getInputStream(); byte[] buf = new byte[4]; int len; StringBuilder sb = new StringBuilder(); while( (len=in.read(buf)) != -1) { sb.append(new String(buf,0,len)); } System.out.println("来自服务器的消息:"+sb.toString()); } catch (IOException e) { e.printStackTrace(); } } }
|
常见异常
[1]端口被占用
|
java.net.BindException: Address already in use: JVM_Bind at java.net.DualStackPlainSocketImpl.bind0(Native Method) at java.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:106) at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387) at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:190) at java.net.ServerSocket.bind(ServerSocket.java:375) at java.net.ServerSocket.<init>(ServerSocket.java:237) at java.net.ServerSocket.<init>(ServerSocket.java:128) at cn.net02.Server01.main(Server01.java:15) Exception in thread "main" java.lang.NullPointerException at cn.net02.Server01.main(Server01.java:24) |
[2]服务器没启动
|
java.net.ConnectException: Connection refused: connect at java.net.DualStackPlainSocketImpl.connect0(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) … |
[3] SocketTimeoutException 连接超时异常。
案例:服务器和客户端双向通信
|
package cn.net03; import java.io.DataInput; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Server01 { public static void main(String[] args) throws IOException { System.out.println("server running...."); ServerSocket serverSocket = new ServerSocket(8000); Socket clientSocket = serverSocket.accept(); // send msg to client OutputStream out = clientSocket.getOutputStream(); String msg = "hello client"; DataOutputStream dos = new DataOutputStream(out); dos.writeUTF(msg); clientSocket.shutdownOutput(); // receive msg2 from client InputStream in = clientSocket.getInputStream(); DataInputStream dis = new DataInputStream(in); String msg2 = dis.readUTF(); System.out.println("来自客户端消息:"+msg2); clientSocket.shutdownInput(); dos.close(); out.close(); in.close(); dis.close(); } } |
|
package cn.net03; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; import javax.print.Doc; public class Client01 { public static void main(String[] args) throws UnknownHostException, IOException { System.out.println("client running..."); Socket socket = new Socket("127.0.0.1",8000); // receive msg from server InputStream in = socket.getInputStream(); DataInputStream dis = new DataInputStream(in); String msg = dis.readUTF(); System.out.println(msg); socket.shutdownInput(); // send msg to server OutputStream out = socket.getOutputStream(); DataOutputStream dos = new DataOutputStream(out); String msg2 = "hello server"; dos.writeUTF(msg2); socket.shutdownOutput(); in.close(); dis.close(); out.close(); dos.close(); } }
|
需求:请发送一张图片到服务器。
需求:c/s模式验证用户名密码。
User序列化是客户端和服务器端的全路径一定要一致。
1.4 UDP编程(B)
需求:客户端A向客户端B发信息
客户端A
|
package cn.net06; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner; public class ClientA { public static void main(String[] args) throws IOException { // 客户端A DatagramSocket ds = new DatagramSocket(8000); while(true) { //System.out.println("请输入"); Scanner sc = new Scanner(System.in); String msg = sc.nextLine(); // --send msg to ClientB -- System.out.println("开始发送数据:"+msg); byte[] buf = msg.getBytes(); InetAddress toIp = InetAddress.getLocalHost(); DatagramPacket dp = new DatagramPacket(buf, buf.length, toIp, 9000); // 构造一个数据报包socket,通过8000用于发送数据报 ds.send(dp); // --receive msg from clientA-- byte[] recBuf = new byte[1024]; DatagramPacket recDp = new DatagramPacket(recBuf, recBuf.length); ds.receive(recDp); String recMsg = new String(recBuf, 0, recDp.getLength()); System.out.println("clientB说:"+recMsg); } // ds.close(); } } |
客户端B
|
package cn.net06; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.util.Scanner; public class ClientB { public static void main(String[] args) throws IOException { // 创建一个datagram socket用于结束clientA 传入的数据 DatagramSocket ds = new DatagramSocket(9000); while (true) { // System.out.println("正在接收信息..."); // --receive msg from clinetA-- byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length); ds.receive(dp); // 从dp中获取接收的内容 String msg = new String(buf, 0, dp.getLength()); System.out.println("clientA说:" + msg); // --send msg to clientA-- Scanner sc = new Scanner(System.in); String sendMsg = sc.nextLine(); byte[] sendBuf = sendMsg.getBytes(); InetAddress toIp = InetAddress.getLocalHost(); DatagramPacket sendPd = new DatagramPacket(sendBuf, sendBuf.length, toIp, 8000); // DatagramSocket sendDs = new DatagramSocket(9000); ds.send(sendPd); } } } |
java网络编程小白教程的更多相关文章
- Java网络编程简明教程
Java网络编程简明教程 网络编程 计算机网络相关概念 计算机网络是两台或更多的计算机组成的网络,同一网络内的任意两台计算机可以直接通信,所有计算机必须遵循同一种网络协议. 互联网 互联网是连接计算 ...
- Java - 30 Java 网络编程
Java 网络编程 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net包中J2SE的API包含有类和接口,它们提供低层次的通信细节.你可以直接使用这些类和接 ...
- Java网络编程和NIO详解开篇:Java网络编程基础
Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为 ...
- 实验五 Java网络编程
实验五 Java网络编程 实验五 Java网络编程 实验五所涉及的密码学算法及编程思路 ## Java对称加密-DES算法 (1) 获取密钥生成器 KeyGenerator kg=KeyGenerat ...
- Java-Runoob-高级编程:Java 网络编程
ylbtech-Java-Runoob-高级编程:Java 网络编程 1.返回顶部 1. Java 网络编程 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.n ...
- 从零探索Java网络编程01之 TCP/IP 与 Socket
最近完成了几项比较简单的项目, 终于是在996里偷了点闲暇时光, 想着来研究研究些啥吧? 一个普通的控制台日志映入了我的眼帘(孽缘呀): (图中使用 SpringBoot 的 log4j 来输出日志 ...
- Java网络编程——Socket
网络是连接不同计算机的媒介,不同的计算机依靠网络来互相通信,即传递数据. Java中与网络编程相关的部分主要是Socket(套接字),它作为一种抽象的结构,实现了与通信相关的各类方法,构成一套完整的通 ...
- 20145205 《Java程序设计》实验报告五:Java网络编程及安全
20145205 <Java程序设计>实验报告五:Java网络编程及安全 实验要求 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.客户端中输入明文,利用DES算法加密,D ...
- Java 网络编程学习总结
新手一枚,Java学习中,把自己学习网络编程的知识总结一下,梳理下知识,方便日后查阅,高手莫进. 本文的主要内容: [1] 网络编程认识 [2] TCP/IP编程 ...
随机推荐
- 使用vscode调试小段的typescript代码
最近在学习typescript.学习 嘛,当然免不了各种练习,试错.那么使用vscode就可以很方便的做到. 首先是安装node.js.我们知道,node.js提供了js脱离浏览器的执行平台.node ...
- c# 笔记cookie
if (Request.Cookies["svpoint"] != null) { Request.Cookies[].s_SvcID.ToString(); } else { H ...
- maven 项目连接mysql8.0版本时的注意事项
MySQL 8.0 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 以前的maven项目,要注意依赖的注入 查看pom. ...
- PLS-00357: Table,View Or Sequence reference 'SEQ_TRADE_RECODE.NEXTVAL' not allowed in this context
oracle数据库: 为了使ID自增,建了序列后,创建触发器: create or replace TRIGGER TRIG_INSERT_TRADE_RECODE BEFORE INSERT ON ...
- Java8增强的包装类
为了解决8中基本数据类型的变量不能当成Object 类型变量使用的问题,Java提供了包装类的概念,为8种基本数据类型分别定义了相应的引用类型,并称为基本数据类型的包装类. JDK 1.5提供了自动装 ...
- LeetCode Weekly Contest 118
要死要死,第一题竟然错误8次,心态崩了呀,自己没有考虑清楚,STL用的也不是很熟,一直犯错. 第二题也是在室友的帮助下完成的,心态崩了. 970. Powerful Integers Given tw ...
- vuex store刷新存储状态
app.vue 平时不想把信息存到session里,只有无可奈何的时候才准备村 <script> export default { name: 'App', created() { //刷 ...
- Cannot redeclare C() (previously declared in .
在引入支付宝入口文件AopSdk.php的时候报错:Cannot redeclare C() (previously declared in D:\phpStudy\WWW\thinkphp\help ...
- Java ascii码值转为输出ascii码
Java ascii码值转为输出ascii码 public static void main(String[] args) { // TODO Auto-generated method stub S ...
- 01: kerberos认证原理
1.1 kerberos认证浅析 1.kerberos定义 1. Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的认证服务. 2. Kerberos ...