网络编程
网络编程概述
计算机网络
是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统
网络编程
在网络通信协议下,不同计算即上运行的程序,可以进行数据传输
网路编程三要素
IP地址:计算机设备的标识,类似身份证的作用
端口:计算机内部各个程序之间用来识别身份的标识
协议:相互通信的规则,互相遵守才能完成数据交换,常见的协议有UDP协议和TCP协议
DOS常用命令:
ipconfig:查看本机IP地址
ping IP地址:检查网络是否连通
特殊IP地址:
127.0.0.1:是回送地址,可以代表本机地址,一般用来测试使用
InetAddress
InetAddress:此类表示Internet协议(IP)地址
-
相关方法
方法名 说明 static InetAddress getByName(String host) 确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址 String getHostName() 获取此IP地址的主机名 String getHostAddress() 返回文本显示中的IP地址字符串 -
代码演示
public class InetAddressDemo { public static void main(String[] args) throws UnknownHostException { //InetAddress address = InetAddress.getByName("itheima"); InetAddress address = InetAddress.getByName("192.168.1.66"); //public String getHostName():获取此IP地址的主机名 String name = address.getHostName(); //public String getHostAddress():返回文本显示中的IP地址字符串 String ip = address.getHostAddress(); System.out.println("主机名:" + name); System.out.println("IP地址:" + ip); } }
端口和协议
端口:设备上应程序的唯一标识.俩个字节表示的整数,取值范围为0-65535.
协议分为俩个
UDP协议
面向无连接通信协议,不建立接连,只管发送和接收,这个协议消耗系统资源小,通信效率高,但是数据不安全,传输重要数据还是不建议使用UDP协议
TCP协议
面向连接的通信协议,就是在传输数据之前,先建立连接,然后在传输数据,每次连接的创建都需要经过三次握手.
三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠
第一次握手,客户端向服务器端发出连接请求,等待服务器确认
第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求
第三次握手,客户端再次向服务器端发送确认信息,确认连接
完成三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了。由于这种面向连接的特性,TCP协议可以保证传输数据的安全,所以应用十分广泛。例如上传文件、下载文件、浏览网页等
UDP通信程序
固定信息发送
package com.heima.test;
import java.io.IOException;
import java.net.*;
//发送端
public class test09 {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket();
//创建数据包
byte[] bys = "hello udp,我来了".getBytes();
DatagramPacket ps = new DatagramPacket(bys,bys.length, InetAddress.getByName("127.0.0.1"),1234);
ds.send(ps);
ds.close();
}
}
//接受端
class test091{
public static void main(String[] args) throws Exception {
DatagramSocket da = new DatagramSocket(1234);
//创建一个数据包 用于接受数据
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys,bys.length);
//调用DatagramSocket方法 接受数据
da.receive(dp);
System.out.println("数据是:"+new String(dp.getData(),0,dp.getLength()));
}
}
键盘输入练习
package com.heima.test;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class test10 {
public static void main(String[] args)throws Exception {
DatagramSocket ds = new DatagramSocket();
Scanner sc = new Scanner(System.in);
while(true){
String s = sc.nextLine();
if("886".equals(s)){
break;
}
//创建数据 并把数据打包
byte[] bys = s.getBytes();
//数据打包
DatagramPacket dp = new DatagramPacket(bys,0,bys.length, InetAddress.getByName("127.0.0.1"),2020);
//数据发送
ds.send(dp);
}
ds.close();
}
}
class test101{
public static void main(String[] args)throws Exception {
DatagramSocket ds = new DatagramSocket(2020);
while(true){
byte [] bys = new byte[1024];
DatagramPacket dr = new DatagramPacket(bys,0,bys.length);
ds.receive(dr);
System.out.println("他说:"+new String(dr.getData(),0,dr.getLength()));
}
}
}
UDP组播实现
package com.heima.test;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;
//发送端
public class test11 {
public static void main(String[] args) throws Exception{
//创建发送端Socket对象
DatagramSocket socket = new DatagramSocket();
String s ="你好,信号良好吗";
byte [] bytes = s.getBytes();
InetAddress inetAddress = InetAddress.getByName("224.0.1.0");//组播 地址 224.0.1.0
int port = 10000;
//打包
DatagramPacket packet = new DatagramPacket(bytes,bytes.length,inetAddress,port);
//调用DatagramSocket对象的方法发送给数据(在单播中,这是发给指定IP 电脑但是在组播中,这是发给组播地址)
socket.send(packet);
socket.close();
}
}
//接收端
class test110{
public static void main(String[] args) throws Exception{
//创建接受端Socket对象(MulticastSocket)
MulticastSocket ms = new MulticastSocket(10000);
//创建一个箱子
DatagramPacket box = new DatagramPacket(new byte[1024],1024);
//把当前计算机绑定一个组播地址,表示添加到这一组中
ms.joinGroup(InetAddress.getByName("224.0.1.0"));
//将数据接收到箱子中
ms.receive(box);
//解析数据包
byte[] data = box.getData();
int len = box.getLength();
System.out.println(new String(data , 0,len));
ms.close();
}
}
UDP广播实现
package com.heima.test;
import javax.xml.transform.SourceLocator;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
//发送端
public class test12 {
public static void main(String[] args)throws Exception {
// 1. 创建发送端Socket对象(DatagramSocket)
DatagramSocket socket = new DatagramSocket();
// 2. 创建存储数据的箱子,将广播地址封装进去
String s = "嗨喽,你们都在吗";
byte [] bys = s.getBytes();
InetAddress address = InetAddress.getByName("255.255.255.255");
DatagramPacket dp = new DatagramPacket(bys,0,bys.length,address,10000);
// 3. 发送数据
socket.send(dp);
// 4. 释放资源
socket.close();
}
}
//接收端
class test121{
public static void main(String[] args) throws Exception{
// 1. 创建接收端的Socket对象(DatagramSocket)
DatagramSocket socket = new DatagramSocket(10000);
// 2. 创建一个数据包,用于接收数据
byte [] bytes = new byte[1024];
// 3. 调用DatagramSocket对象的方法接收数据
DatagramPacket dp = new DatagramPacket(bytes,0,bytes.length);
// 4. 解析数据包,并把数据在控制台显示
socket.receive(dp);
byte[] data = dp.getData();
int length = dp.getLength();
System.out.println(new String(data,0,length));
// 5. 关闭接收端
socket.close();
}
}
TCP通信程序
Java中的TCP通信
Java对基于TCP协议的网络提供了良好的封装,使用Socket对象来代表俩端的通信端口,并通过Socket产生了IO流来进行网络通信
Java为客户端提供了Socket类,为服务器提供了ServerSocket类
TCP发送数据和TCP接受数据
package com.heima.test;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
//发送信息
public class test13 {
public static void main(String[] args) throws IOException {
//创建客户端的Socket对象 Socket(String host,int port)
Socket s = new Socket("127.0.0.1",10000);
//获取输出流 写数据 OutputStream getOutputStream() 返回输出流
OutputStream os = s.getOutputStream();
os.write("你好昂啊 我是好人".getBytes());
//释放资源
s.close();
}
}
//接受信息
class test131{
public static void main(String[] args) throws IOException {
//创建服务器端的Socket对象(ServerSocket)
//SrverSocket(int port) 创建绑定到指定端口的服务器套接字
ServerSocket ss = new ServerSocket(10000);
//等待连接 侦听要连接到次套接字并接受它
Socket accept = ss.accept();
//获取输入流 读数据 把数据显示在控制台上
InputStream is = accept.getInputStream();
byte [] bys = new byte[1024];
int len = is.read(bys);
String data = new String(bys,0,len);
System.out.println("数据是:"+data);
//释放资源
is.close();
accept.close();
ss.close();
}
}
TCP程序练习
-
案例需求
客户端:发送数据,接受服务器反馈
服务器:收到消息后给出反馈
-
案例分析
- 客户端创建对象,使用输出流输出数据
- 服务端创建对象,使用输入流接受数据
- 服务端使用输出流给出反馈数据
- 客户端使用输入流接受反馈数据
-
代码实现
package com.heima.test; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; //客户端 public class test14 { public static void main(String[] args) throws IOException { //客户端发送确认信息 Socket s = new Socket("127.0.0.1",2021); OutputStream os = s.getOutputStream(); os.write("你好,服务器".getBytes()); s.shutdownOutput();//如果 os.close(); 将流关闭 会导导致整个socket都无法使用 //Socket中的shutdownOutput()方法仅仅关闭输出流 BufferedInputStream bis = new BufferedInputStream(s.getInputStream());//使用字符缓冲流最方便 int len; byte[] buffer = new byte[1024]; while((len=bis.read(buffer)) != -1){ System.out.println(new String(buffer,0,len)); } bis.close(); os.close(); s.close(); } } //服务器 class test141{ public static void main(String[] args) throws IOException { ServerSocket ss = new ServerSocket(2021); Socket accept = ss.accept(); InputStream is = accept.getInputStream(); int len; byte [] buffer = new byte[1024]; while((len=is.read(buffer)) != -1){ System.out.println(new String(buffer,0,len)); } System.out.println("看看我执行了吗"); OutputStream os = accept.getOutputStream();//使用字符缓冲流最方便 os.write("你谁啊".getBytes()); os.close(); is.close(); accept.close(); ss.close(); } }
TCP程序文件上传练习
package com.heima.test;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
//客户端
public class test15 {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",2021);
//读取本地文件
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\ps.cc\\ps素材\\证件照\\蕊.jpg"));
//发送到网络流
OutputStream os = socket.getOutputStream();
int len;
byte [] buffer= new byte[1024];
while((len=bis.read(buffer))!=-1){
os.write(buffer,0,len);
}
socket.shutdownOutput();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line;
while((line=br.readLine()) != null){
System.out.println(line);
}
bis.close();
br.close();
socket.close();
}
}
//服务器端
class test151{
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(2021);
Socket accept = ss.accept();
//接受客户端发来的文件
BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("itHeiMa\\美女.jpg"));
int len;
byte [] buffer = new byte[1024];
while((len=bis.read(buffer))!=-1){
bos.write(buffer,0,len);
}
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
bw.write("上传成功");
bw.close();
bis.close();
accept.close();
bos.close();
ss.close();
}
}