网络编程
1、计算机网络概念
网络即将不同区域的电脑连接到一起,组成局域网、城域网或广域网。
主要功能:
1、资源共享
2、信息传输与集中处理
3、均衡负荷与分布处理
2、通讯协议
计算机网路必须按照相同的通讯协议才能实现网络共享。
协议三要素:语义,语法,时序
3、网络爬虫
public class SpiderDemo05 {
public static void main(String[] args) throws IOException {
URL url = new URL("http://www.baidu.com");
//InputStream openStream()
BufferedReader rd = new BufferedReader(new InputStreamReader(url.openStream()));
String msg = null;
while((msg=rd.readLine())!=null){
System.out.println(msg);
}
rd.close();
}
}
4、传输层协议
TCP协议:
打电话面向连接、安全、可靠、效率低
UDP协议:
发送短信非面向连接、不安全、数据可能丢失、效率高
UDP定义发送端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
/*
协议: 传输层协议
UDP :非面向连接 写信 不安全 协议小 简单 效率高 大小限制一般不超60k
TCP :面向连接 打电话 安全 效率低 没有大小限制 3次握手
面向Socket编程
Socket 套接字
是传输层为应用层开辟的一个小口子,用来传输或者接受数据
不同写一下Socket实现不同
UDP:
DatagramSocket : 定义发送端和接收端
DatagramPacket : 打包
UDP定义发送端:
1.定义我是发送端 DatagramSocket(int port)
2.准备数据
3.打包 DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) 构造一个数据报包发送数据包的长度 length抵消 ioffsetto指定主机上的指定端口号。
4.发送 send(DatagramPacket p)
5.关闭
*/
public class UDPSend01 {
public static void main(String[] args) throws Exception {
//1.定义我是发送端 DatagramSocket(int port)
DatagramSocket send = new DatagramSocket(8888);
System.out.println("我是 发送端...");
//2.准备数据
String str = "发发发";
byte[] bytes = str.getBytes();
//3.打包
DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length,new InetSocketAddress("127.0.0.1",9999));
//4.发送
send.send(packet);
//5.关闭
send.close();
}
}
UDP定义接收端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/*
UDP定义接收端:
1.定义我是接收端
2.准备包裹,用来接收数据 DatagramPacket(byte[] buf, int length)
3.接收
4.处理数据
5.关闭
*/
public class UDPReceive02 {
public static void main(String[] args) throws Exception {
//1.定义我是接收端
DatagramSocket rec = new DatagramSocket(9999);
System.out.println("我是接收端....");
// 2.准备包裹,用来接收数据
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes,bytes.length);
// 3.接收
rec.receive(packet);
// 4.处理数据
//getData() getLength()
byte[] arr = packet.getData();
int len = packet.getLength();
System.out.println(new String(arr,0,len));
// 5.关闭
rec.close();
}
}
TCP定义客户端
import java.io.*;
import java.net.Socket;
/*
tcp实现登录: 客户端
*/
public class TCPLoginClient01 {
public static void main(String[] args) throws Exception {
//1.定义我是一个客户端 Socket
Socket client = new Socket("localhost",9999);
System.out.println("------------------Client--------------");
/*
接收用户键盘输入的用户名与密码
*/
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入用户名:");
String name = reader.readLine();
System.out.println("请输入密码:");
String pwd = reader.readLine();
//2.获取输出流 getOutputStream()
DataOutputStream os = new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));
//3.写出字符串
os.writeUTF("username="+name+"&password="+pwd);
//4.刷出
os.flush();
//5.接收服务器端给响应
DataInputStream is = new DataInputStream(new BufferedInputStream(client.getInputStream()));
System.out.println(is.readUTF());
//6.关闭
os.close();
client.close();
}
}
TCP定义服务端
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/*
tcp实现登录: 服务器端
用户名 =laopei
密码 =1234
考虑: 对多个客户端做响应?????
*/
public class TCPLoginServer02 {
public static void main(String[] args) throws Exception {
//1.定义我是服务端
ServerSocket server = new ServerSocket(9999);
System.out.println("--------------Server-----------------");
//2.阻塞式监听
Socket client = server.accept();
System.out.println("一个客户端已经连接成功....");
//3.获取输入流
DataInputStream is = new DataInputStream(new BufferedInputStream(client.getInputStream()));
//4.读入 数据
String msg = is.readUTF();
//处理数据
String name = "";
String pwd = "";
String[] arr = msg.split("&");
for(String str : arr){
String[] a = str.split("=");
if("username".equals(a[0])){
name = a[1];
}else if("password".equals(a[0])){
pwd = a[1];
}
}
//获取输出流 响应给客户端结果
DataOutputStream os = new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));
//判断
if("laopei".equals(name) && "1234".equals(pwd)){
os.writeUTF("登录成功");
}else{
os.writeUTF("登录失败");
}
//刷出
os.flush();
//5.关闭
os.close();
is.close();
client.close();
server.close();
}
}