java 网络编程(BI0)
1.协议TCP/UDP
Java网络程序有两种协议,tcp协议和udp协议。Tcp协议面向连接(三次握手)可靠的协议(基于字节流的传输层协议),但是传输速度慢。Udp提供简单不可靠的行西传输服务,不属于连接型服务,传输速度快,容易出现丢包现象。
2.SMTP简单邮件传输协议
3. ip:网络地址(确定网络)和主机地址(网络中的主机)组成
Window下在命令行中输入ipconfig查看本机ip地址,输入ping+ 目标ip地址查看网络是否通畅。
4.url:统一资源定位符格式:[scheme:]scheme-specific-part[#fragment]
Scheme:协议http\https\ftp\file等 scheme-specific-part表示其他部分
5.Socket:(通信链路的端口,也被称为套接字)
1.基于tcp协议的socket通信
•基于TCP协议的socket通信,用于实现双向安全的网络同行,进行通信时socket需要借助数据流来完成数据的传递工作。
•基于TCP协议网络编程步骤:1.建立连接->打开使用socket关联的输入输出流->数据流中读写信息->关闭所有的数据流和socket (客户端和服务器之间信息传递)
•实现多个客户端和服务器的信息传递(创建服务器端线程类或者一个操作类,实现对一个请求的响应处理->循环监听请求)
客户端代码:
package lesson13;
import java.io.*;
import java.net.Socket;
public class s3 {
public static void main(String[]args) throws IOException{
//创建客户端Socket,指定服务器和端口
Socket sc=new Socket("localhost",10086);
//获取输出流向服务端发送信息
OutputStream os=sc.getOutputStream();//字节输出流
PrintWriter pw=new PrintWriter(os);//将输出流包装成打印流
pw.write("用户名:name;密码:789");
pw.flush();
sc.shutdownOutput();//关闭输出流
//获取输入流,并读取服务端的响应信息
InputStream is=sc.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String info=null;
while((info=br.readLine())!=null){
System.out.println("我是客户端,服务器说:"+info);
}
//关闭资源
br.close();
is.close();
pw.close();
os.close();
sc.close();
}
}
服务器端代码;
package lesson13; /* 服务器端: ① 创建ServerSocket对象,绑定监听端口 ② 通过accept()方法监听客户端请求 ③ 连接建立后,通过输入流读取客户端发送的请求信息 ④ 通过输出流向客户端发送乡音信息 ⑤ 关闭相关资源 */ import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class Sket { public static void main(String[] args) throws IOException{ //创建一个服务器socket,即ServerSocket,指定绑定端口,并监听此窗口 ServerSocket ss = new ServerSocket(10086); //调用accept()方法开始监听,等待客户端连接 Socket sc=ss.accept(); //获取输入流,读取客户端信息 InputStream is=sc.getInputStream(); InputStreamReader isr=new InputStreamReader(is); BufferedReader br=new BufferedReader(isr); String info=null; while((info=br.readLine())!=null){ System.out.println("我是服务器,客户端说:"+info); } sc.shutdownInput();//关闭输入流 //获取输入流,获取客户端的请求 OutputStream os=sc.getOutputStream(); PrintWriter pw=new PrintWriter(os); pw.write("欢迎您!"); pw.flush(); //关闭资源 pw.close(); os.close(); br.close(); isr.close(); is.close(); sc.close(); ss.close(); } }
接收多个服务器的客户端代码:
package lesson13; import java.io.*; import java.net.ServerSocket; import java.net.Socket; /** * Created by jone on 2018/1/19. */ public class mutilsket2 { public static void main(String[] args) throws IOException{ //创建一个ServerSocket,绑定端口 ServerSocket ss=new ServerSocket(10086); //调用accept方法开始监听客户端连接,accept返回的是一个新的套接字 Socket sc=null; int count=0; while(true){ sc=ss.accept();//监听客户端连接 operate(sc); count++; System.out.println("客户端访问数量:"+count); } } //处理一个请求 public static void operate(Socket sc)throws IOException{ //接受客户端的信息 //获取输入输出流 getInputStream InputStream in=sc.getInputStream(); //创建reader对象 InputStreamReader isr=new InputStreamReader(in); //创建bufferedReader对象 BufferedReader br=new BufferedReader(isr); //创建空字符串 String info=null; while ((info=br.readLine())!=null){ System.out.println("客户端数据为:"+info); } //给客户端发送信息 //创建服务器端的输出流 getOutputStream OutputStream os=sc.getOutputStream(); PrintWriter pw=new PrintWriter(os); pw.write("欢迎你!"); pw.flush(); //关闭资源 br.close(); isr.close(); in.close(); pw.close(); os.close(); } }
2.基于udp协议的socket通信
•基于udp协议socket通信步骤:利用DatagramPacket对象封装数据包->利用DatagramSocket发数据包->利用DatagramSocket收数据包->利用DatagramPacket处理数据包。
客户端代码:
package lesson13; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /** 2、客户端实现步骤 ① 定义发送信息 ② 创建DatagramPacket,包含将要发送的信息 ③ 创建DatagramSocket ④ 发送数据 */ public class Udp_kh { public static void main(String[] args) throws Exception{ //定义服务器的地址、端口号、数据 InetAddress address=InetAddress.getByName("localhost"); int port=10010; byte[] data="用户名:admin;密码:123".getBytes(); //创建数据报 DatagramPacket pc=new DatagramPacket(data,data.length,address,port); DatagramSocket sc=new DatagramSocket(); //向服务器发送报表 sc.send(pc); //=================================================== //创建数据报,用于接受服务器响应数据 byte[] data2=new byte[1024]; DatagramPacket pc2=new DatagramPacket(data2,data2.length); //接受服务器响应数据 sc.receive(pc2); String reply=new String(data2,0,pc2.getLength()); System.out.println("我是客户端,服务器说:"+reply); //关闭资源 sc.close(); } }服务器代码:
package lesson13; /* UDP协议(用户数据报协议)是无连接的、不可靠的、无序的,速度快 进行数据传输时,首先将要传输的数据定义成数据报(Datagram),大小限制在64k,在数据报中指明数据索要达到的Socket(主机地址和端口号),然后再将数据报发送出去 DatagramPacket类:表示数据报包 DatagramSocket类:进行端到端通信的类 1、服务器端实现步骤 ① 创建DatagramSocket,指定端口号 ② 创建DatagramPacket ③ 接受客户端发送的数据信息 ④ 读取数据 */ import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class Udp { public static void main(String[] args) throws IOException{ //创建服务器端DatagramSocket,指定端口 DatagramSocket sc=new DatagramSocket(10010); //创建数据报,用于接受客户端发送的数据 byte[] data=new byte[1024]; DatagramPacket pc=new DatagramPacket(data,data.length); //接受客户端发送的数据 sc.receive(pc);//此方法在接受数据报表时会阻塞 //读取数据 String info = new String(data,0,data.length); System.out.printf("我是服务器,客户端告诉我:"+ info); //======================================= //向客户端响应数据 //定义客户端地址,端口号,数据 InetAddress address=pc.getAddress(); int port=pc.getPort(); byte[] data2="欢迎您".getBytes(); //创建数据报,包含响应的数据信息 DatagramPacket pc2=new DatagramPacket(data2,data2.length,address,port); //响应客户端 sc.send(pc2); //关闭资源 sc.close(); } }