网络编程
1.1 概述
计算机网络:计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
javaweb:网页编程 B/S
tcp/ip:网络编程 C/S
1.2 网络通信要素
通信双方的地址:
- ip
- 端口号
规则:网络通信的协议
TCP/IP参考模型:
网络编程的要素:
- ip和端口号
- 网络通信协议 udp/tcp
1.3 IP
ip地址:InetAddress类
本机:127.0.0.1 localhost
IP地址分类:
- ipv4和ipv6
- ipv4 127.0.0.1 4个字节,0~255
- ipv6 128位 8个无符号整数!
- 公网(互联网)和私网(局域网)
- 192.168.X.X
- ABCD类地址
域名:记忆ip地址
package com.ljl.study01;
import java.net.InetAddress;
import java.net.UnknownHostException;
//测试ip
public class TestInetAddress {
public static void main(String[] args) {
try {
//访问主机ip地址
InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");
InetAddress inetAddress3 = InetAddress.getByName("localhost");
InetAddress inetAddress4 = InetAddress.getLocalHost();
System.out.println(inetAddress1);
System.out.println(inetAddress3);
System.out.println(inetAddress4);
//访问百度ip地址
InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com");
System.out.println(inetAddress2);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
1.4 端口
端口表示计算机上一个程序的进程
-
不同的进程有不同的端口号!用来区分软件
-
被规定0~65535
-
TCP/UDP 65535*2 tcp:80 udp:80 但是同一个协议下,端口号不能冲突
-
端口分类
- 公有端口0~1023
- HTTP:80
- HTTPS:443
- FTP:21
- Telent:23
- 程序注册端口:1024~49151,分配用户或者程序
- tomcat:8080
- MySQL:3306
- Oracle:1521
- 程序注册端口:1024~49151,分配用户或者程序
- 公有端口0~1023
-
动态私有端口 49152~65535
1.5 通信协议
TCP/IP协议簇
-
TCP:传输控制协议
-
UDP:用户数据报协仪
1.6 TCP
-
客户端
-
连接服务器socket
-
建立输出流输出消息
package com.ljl.study02; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; public class TestClient01 { public static void main(String[] args) throws Exception { //连接服务器根据服务器的ip和端口 Socket socket = new Socket(InetAddress.getByName("localhost"), 9999); //建立输出流 OutputStream os = socket.getOutputStream(); os.write("我向服务器发送了请求".getBytes()); os.close(); socket.close(); } }
-
-
服务器
-
建立服务的窗口 ServerSocket
-
等待用户的连接 accpet
-
建立输入流接受用户消息
package com.ljl.study02; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class TestServer01 { public static void main(String[] args)throws Exception { //建立服务器端口 ServerSocket SS = new ServerSocket(9999); //等待客户端连接 Socket socket = SS.accept(); //建立输入流 InputStream is = socket.getInputStream(); //管道流 ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len; while ((len=is.read(buffer))!=-1) { baos.write(buffer, 0, len); } System.out.println(baos.toString()); // 释放资源 baos.close(); is.close(); socket.close(); SS.close(); } }
文件上传
-
客户端
package com.ljl.study02; import java.io.File; import java.io.FileInputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; public class TestClient02 { public static void main(String[] args) throws Exception { //连接服务器 Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9900); //输出流 OutputStream os =socket.getOutputStream(); //文件输入流 FileInputStream fis = new FileInputStream(new File("丁海寅.jpg")); byte []buffer = new byte[1024]; int len; while((len=fis.read(buffer))!=-1){ os.write(buffer,0,len); } //资源关闭 fis.close(); os.close(); socket.close(); } }
-
服务器
package com.ljl.study02; import java.io.FileOutputStream; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class TestServer02 { public static void main(String[] args)throws Exception { //建立服务器 ServerSocket ss =new ServerSocket(9900); //等待连接 Socket socket =ss.accept(); //输入流 InputStream is = socket.getInputStream(); //文件输出流 FileOutputStream fos = new FileOutputStream("recive.jpg"); byte[]buffer =new byte[1024]; int len; while ((len=is.read(buffer))!=-1){ fos.write(buffer,0,len); } System.out.println(); fos.close(); is.close(); socket.close(); ss.close(); } }
-
-
1.7 UDP
发送消息
-
发送端
package com.ljl.study03; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UdpSend01 { public static void main(String[] args)throws Exception { //建立通道 DatagramSocket socket = new DatagramSocket(); //建立数据包 发送内容,长度,ip,端口号 DatagramPacket packet = new DatagramPacket("你好,接收方".getBytes(), 0, "你好,接收方".getBytes().length, InetAddress.getByName("localhost"), 9090); //发送包 socket.send(packet); //释放资源 socket.close(); } }
-
接收端
package com.ljl.study03;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpReceive01 {
public static void main(String[] args)throws Exception {
//建立通道端口
DatagramSocket socket = new DatagramSocket(9090);
//接受数据包
byte []buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
//接收数据
socket.receive(packet);
System.out.println(packet.getAddress().getHostAddress());
//输出数据
System.out.println(packet.getData().toString());
System.out.println(packet.getData());
System.out.println(new String(packet.getData(),0,packet.getLength()));
System.out.println(packet.getLength());
System.out.println(packet.getPort());
//释放资源
socket.close();
}
}
咨询
-
控制台发送消息
package com.ljl.study03; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UdpSend02 { public static void main(String[] args) throws Exception { //建立通道 DatagramSocket socket = new DatagramSocket(9999); //准备数据(控制台读取) while (true) { //循环发送 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String data = reader.readLine(); DatagramPacket packet = new DatagramPacket(data.getBytes(), 0, data.getBytes().length, InetAddress.getByName("localhost"), 6666); //发送数据 socket.send(packet); if ("bye".equals(data)){ //结束条件 break; } } socket.close(); } }
-
接收消息
package com.ljl.study03; import java.net.DatagramPacket; import java.net.DatagramSocket; public class UdpReceive02 { public static void main(String[] args) throws Exception { DatagramSocket socket = new DatagramSocket(6666); while (true) { //循环接收 //接收包裹 byte[] buffer = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length); if ("bye".equals(new String(packet.getData(),0,packet.getLength()))){ break; } socket.receive(packet); System.out.println(new String(packet.getData(), 0, packet.getLength())); } socket.close(); } }
在线咨询系统(利用多线程实现)
通过两个线程类和两个主类实现了简易的网站咨询通讯系统
- 发送信息线程
package com.ljl.chatThread;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class SendThread implements Runnable {
DatagramSocket socket ;
BufferedReader reader;
private int fromPort;
private String toIp;
private int toPort;
public SendThread(int fromPort,String toIp,int toPort){
this.fromPort=fromPort;
this.toIp=toIp;
this.toPort = toPort;
try {
socket =new DatagramSocket(fromPort);
reader = new BufferedReader(new InputStreamReader(System.in));
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
//准备数据(控制台读取)
try {
while (true) { //循环发送
String data = reader.readLine();
DatagramPacket packet = new DatagramPacket(data.getBytes(), 0, data.getBytes().length, InetAddress.getByName(toIp), toPort);
//发送数据
socket.send(packet);
if ("bye".equals(data)){
//结束条件
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
socket.close();
}
}
- 接收信息线程
package com.ljl.chatThread;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class ReceiveThread implements Runnable {
DatagramSocket socket;
int fromPort;
public ReceiveThread(int fromPort){
this.fromPort =fromPort;
try {
socket =new DatagramSocket(fromPort);
} catch (SocketException e) {
e.printStackTrace();
}
}
public void run() {
try {
while (true) {
//循环接收
//接收包裹
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
if ("bye".equals(new String(packet.getData(), 0, packet.getLength()))) {
break;
}
socket.receive(packet);
System.out.println(Thread.currentThread().getName()+":"+new String(packet.getData(), 0, packet.getLength()));
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
- WebWorker类
package com.ljl.chatThread;
public class WedWorker {
public static void main(String[] args) {
new Thread(new SendThread(5555,"localhost",6666)).start();
new Thread(new ReceiveThread(8888),"Student").start();
}
}
- Student类
package com.ljl.chatThread;
public class Student {
public static void main(String[] args) {
new Thread(new SendThread(9999,"localhost",8888)).start();
new Thread(new ReceiveThread(6666),"WebWorker").start();
}
}
1.8 URL
https://www.baidu.com/
统一资源定位符:定位互联网上的某一个资源
网上下载资源(视频 ,音乐。图片,文件)
//协议://IP地址:端口/项目名/资源
package com.ljl.URL;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class Demo02 {
public static void main(String[] args) throws Exception {
/* 1.下载地址 */
URL url = new URL("http://vodkgeyttp9c.vod.126.net/vodkgeyttp8/arRSqjbv_1361771846_sd.mp4?");
//2.连接到这个资源 HTTP 强制转换
HttpURLConnection urlConnection =(HttpURLConnection) url.openConnection();
//输入流
InputStream is = urlConnection.getInputStream();
//文件输出流
FileOutputStream fos = new FileOutputStream("PLANET.mp4");
byte[] buffer = new byte[1024];
int len;
while((len=is.read(buffer))!=-1){
fos.write(buffer,0,len);
}
//释放资源
fos.close();
is.close();
urlConnection.disconnect();
}
}