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编程 ...
随机推荐
- 基于C#的Appium自动化测试框架(Ⅰ):程序结构
因为工作原因,使用的编程语言都是C#,但是国内相应的Appium资料少得可怜,Java版本的Appium也考虑过,但是奈何自己搞不定Eclipse这个编译环境[说白了就是因为懒…… 无意中看到了外面的 ...
- python模块与路径
# 切记不能与方法函数同名,否则会报错!!! # python的模块与包 分为三种: #1.标准库 #2.第三方模块 #3.自定义模块 #python 模块的引入原理: # 加入你创建了一个模块,在i ...
- elastic-job集成到springboot教程,和它的一个异常处理办法:Sharding item parameters '1' format error, should be int=xx,int=xx
先说这个Sharding item parameters '1' format error, should be int=xx,int=xx异常吧,这是在做动态添加调度任务的时候出现的,网上找了一会没 ...
- IT题库1-HashMap、HashSet和HashTable(区别?数据格式?)
1. HashTable和HashMap的区别 HashMap和Hashtable都实现了Map接口.主要区别:线程安全性,同步(synchronization),以及速度. 1.HashMap是非s ...
- 使用gulp构建一个项目
gulp是前端开发过程中自动构建项目的工具,相同作用的还有grunt.构建工具依靠插件能够自动监测文件变化以及完成js/sass/less/html/image/css/coffee等文件的语法检查. ...
- omitting directory `folder/'
题记:一个问题,若遇见第一次,不知道如何解决,经查资料后处理掉可以原谅:若遇见第二次,还是一头雾水!反省自己,特此备录. 在linux CentOS6.5 系统中复制文件夹时提示如下: cp: omi ...
- Deep Convolution Auto-encoder
一.概念介绍 自编码器是一种执行数据压缩的网络架构,其中的压缩和解压缩功能是从数据本身学习得到的,而非人为手工设计的.自编码器的两个核心部分是编码器和解码器,它将输入数据压缩到一个潜在表示空间里面,然 ...
- Linux环境配置文件的理解
百度百科: .bashrc这个文件主要保存个人的一些个性化设置,如命令别名.路径等.也即在同一个服务器上,只对某个用户的个性化设置相关. 示例: 编辑# User specific aliases a ...
- java线程学习之Sleep方法
sleep方法是在线程中常用到的一个方法,它是一个静态方法. sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度 ...
- 向日葵连CentOS
TeamViewer可以连CentOS,但TeamViewer最近老是提示“检测为商业用途”,5分钟就会自动断,用起来非常不爽,所以决定改用向日葵试下,向日葵目前的口碑也不错,更何况是国产软件,更要支 ...