网络编程
计算机网络:不同的地理位置 连接 网络通信协议 实现资源共享
目的:数据交换 通信
如何准确的定位网络上的一台主机 192.168.16.124:端口
网络通信的要素
-
ip
-
ip地址 :InetAddress
-
唯一定位一台网络上的计算机
-
127.0.0.1:本机 locallhost
-
ip地址的分类:
-
ipv4/ipv6 2.公网(互联网 )-私网(局域网) *ABCD类地址 *192.168.xx.xx,专门给组织内部使用
-
ipv4: 127.0.0.1,4个字节组成 0~255,42亿,30亿都在北美,亚洲4亿,2011年就用尽
-
ipv6: 128位 8个无符号整数
2001:Obb2:aaaa:0015:0000:0000:1aaa:1312
-
-
-
-
端口号
-
网络通信协议:TCP UDP
-
域名: 记忆ip问题
ip
public class TestInetAddress { public static void main(String[] args) { try { //查询本机地址 InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1"); System.out.println(inetAddress1 ); InetAddress inetAddress3 = InetAddress.getByName("localhost"); System.out.println(inetAddress3 ); InetAddress inetAddress4 = InetAddress.getLocalHost(); System.out.println(inetAddress4 ); //查询网站地址 InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com"); System.out.println(inetAddress2); //常用方法 System.out.println(inetAddress2.getCanonicalHostName()); //规范的名字 System.out.println(inetAddress2.getHostAddress());//ip System.out.println(inetAddress2.getHostName());//域名 或者自己电脑的名字 } catch (UnknownHostException e) { throw new RuntimeException(e); } } }
端口
-
端口表示计算机上的一个程序的进程 PID P:process 进程
-
不同的进程有不同的端口号!用来区分软件
-
被规定 ~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
---------动态,私有 49152·65535
1. netstat -ano //查看所有的端口 2. netstat -ano|findstr 5900 //查看指定的端口 3.tasklist|findstr 8696//查看指定端口的进程
public class TestInetSocketAddress { public static void main(String[] args) { InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1", 8080); System.out.println(socketAddress); InetSocketAddress socketAddress2 = new InetSocketAddress("localhost", 8080); System.out.println(socketAddress2); System.out.println(socketAddress.getAddress()); System.out.println(socketAddress.getPort());//端口 System.out.println(socketAddress.getHostName());//地址 } }
通信协议
网络通信协议: 速率,传输码率,代码结构,传输控制
问题: 大事化小,分层
TCP/IP协议簇,是一组协议
-
TCP:用户传输协议
打电话
**连接,稳定
**三次握手,四次挥手
//最少需要3次,保证稳定连接 A:你瞅啥 B:瞅你咋地 A:打一架 A:我要走了 B:你要走吗? B:你走了吗? A:我走了
**客户端,服务端
**传输完成,释放连接,效率低
-
IP:网络互联协议
-
UDP:用户数据报协议
**发短信
**不连接,不稳定
**客户端,服务端:没有明确的界限
**不管有没有准备好,都可以发给你..
**导弹
**DDOS:洪水攻击(饱和攻击)
TCP实现聊天
客户端
1.连接服务器Socket
2.发送消息
public class TcpClientDemo01 { public static void main(String[] args) { Socket socket =null; OutputStream os =null; try { //1.要知道服务的地址 端口号 InetAddress serverIP = InetAddress.getByName("127.0.0.1"); int port = 9999; //2.创建一个socket连接 socket = new Socket(serverIP,port); //3.发送消息 IO流 os = socket.getOutputStream(); os.write("你好,欢迎学习java".getBytes()); } catch (Exception e) { throw new RuntimeException(e); }finally { if(os!=null){ try { os.close(); } catch (IOException e) { throw new RuntimeException(e); } } if(socket!=null){ try { socket.close(); } catch (IOException e) { throw new RuntimeException(e); } } } } }
服务器
1.建立服务的端口 ServerSocket
2.等待用户的连接 accept
3.接受用户端的消息
public class TcpServerDemo01 { public static void main(String[] args) { ServerSocket serverSocket = null; Socket socket = null; InputStream is = null; ByteArrayOutputStream baos = null; try { //1.我得有一个地址 serverSocket = new ServerSocket(9999); //2.等待客户端连接过来 while(true){ socket = serverSocket.accept(); //3.读取客户信息 is = socket.getInputStream(); //管道流 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()); } } catch (IOException e) { throw new RuntimeException(e); } finally { //关闭资源 if (baos != null) { try { baos.close(); } catch (IOException e) { throw new RuntimeException(e); } } if (is != null) { try { is.close(); } catch (IOException e) { throw new RuntimeException(e); } } if (socket != null) { try { socket.close(); } catch (IOException e) { throw new RuntimeException(e); } } if (serverSocket != null) { try { serverSocket.close(); } catch (IOException e) { throw new RuntimeException(e); } } } } }
-
-
-
-
TCP实现文件上传
客户端
public class TcpClientDemo02 {
public static void main(String[] args) throws IOException {
//创建一个socket连接
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
//创建一个输出流
OutputStream os = socket.getOutputStream();
//读取文件
FileInputStream fis = new FileInputStream(new File("x.JPG"));
//4.写出文件
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer))!=-1){
os.write(buffer,0,len);
}
//5.关闭资源
fis.close();
os.close();
socket.close();
}
}
服务端
public class TcpServerDemo02 {
public static void main(String[] args) throws IOException {
//1.创建服务
ServerSocket serverSocket = new ServerSocket(9000);
//2.监听客户端的连接(阻塞式监听,会一直等待客户连接)
Socket socket = serverSocket.accept();
//3.获取输入流
InputStream is= socket.getInputStream();
//4.文件输出
FileOutputStream fos = new FileOutputStream(new File("reveice.JPG"));
byte[] buffer= new byte[1024];
int len;
while((len=is.read(buffer))!=-1){
fos.write(buffer,0,len);
}
//5.关闭资源
fos.close();
is.close();
socket.close();
serverSocket.close();
}
}
Tomcat
服务端 Tomcat服务器
客户端 浏览器
UDP
发送端
public class UDPDemo1 {
//不需要连接服务器
public static void main(String[] args) throws IOException {
//1.建立一个Socket
DatagramSocket socket = new DatagramSocket();
//2.建个包
String msg = "你好啊,服务器";
InetAddress localhost = InetAddress.getByName("localhost");
int port = 9090;
//数据 数据长度起始 要发送给谁
DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);
//3.发送包
socket.send(packet);
//4.关闭流
socket.close();
}
}
接收端
public class UDPDemo02 {
public static void main(String[] args) throws IOException {
//开放端口
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(new String(packet.getData(),0,packet.getLength()));
//关闭连接
socket.close();
}
}
udp聊天实现
public class UDPSenderDemo01 {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(8888);
//准备数据 从控制台读取 System.in
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while(true) {
String data = reader.readLine();//不可读,必须转成字节
byte[] datas = data.getBytes();
DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress("localhost", 6666));
socket.send(packet);
if(data.equals("bye")){
break;
}
}
socket.close();
}
}
public class UDPServerDemo01 {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(6666);
while (true) {
//准备接收包裹
byte[] container = new byte[1024];
DatagramPacket packet = new DatagramPacket(container, 0, container.length);
socket.receive(packet);//阻塞式接受包裹
//断开连接 bye
byte[] data = packet.getData();
String datas = new String(data,0,packet.getLength());
System.out.println(datas);
if(datas.equals("bye")){
break;
}
}
socket.close();
}
}
UDP多线程在线咨询
TalkSend/TalkService
public class TalkSend implements Runnable{
DatagramSocket socket = null;
BufferedReader reader = null;
private int fromport;
private String toip;
private int toport;
public TalkSend(int fromport, String toip, int toport) throws SocketException {
this.fromport = fromport;
this.toip = toip;
this.toport = toport;
socket = new DatagramSocket(fromport);
reader = new BufferedReader(new InputStreamReader(System.in));
}
@Override
public void run() {
while(true) {
try {
String data = reader.readLine();
byte[] datas = data.getBytes();
DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress(this.toip,this.toport));
socket.send(packet);
if(data.equals("bye")){
break;
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
socket.close();
}
}
public class TalikReveice implements Runnable{
DatagramSocket socket = null;
private int port;
private String msgfrom;
public TalikReveice(int port,String msgfrom) throws SocketException {
socket= new DatagramSocket(port);
this.port = port;
this.msgfrom=msgfrom;
}
@Override
public void run() {
try {
while (true) {
//准备接收包裹
byte[] container = new byte[1024];
DatagramPacket packet = new DatagramPacket(container, 0, container.length);
socket.receive(packet);//阻塞式接受包裹
//断开连接 bye
byte[] data = packet.getData();
String datas = new String(data,0,packet.getLength());
System.out.println(msgfrom+": "+datas);
if(datas.equals("bye")){
break;
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
socket.close();
}
}
4个线程
public class TalkStudent {
public static void main(String[] args) throws SocketException {
new Thread(new TalkSend(7777,"localhost",9999)).start();
new Thread(new TalikReveice(8888,"老师")).start();
}
}
public class TalkTeacher {
public static void main(String[] args) throws SocketException {
new Thread(new TalkSend(5555,"localhost",8888)).start();
new Thread(new TalikReveice(9999,"学生 ")).start();
}
}
URL
- 统一资源定位符 :定位资源的,定位互联网某一个资源
- DNS域名解析 www.baidu.com xxx.xx.xx
- 协议://ip地址:端口/项目名/资源
-
public class TestDemo01 { public static void main(String[] args) throws IOException { //下载地址 URL url = new URL("http://localhost:8080/qinjiang/cch.txt"); //连接地址 HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection(); InputStream inputStream = urlConnection.getInputStream(); FileOutputStream fos = new FileOutputStream("cch.txt"); byte[] buffer = new byte[1024]; int len; while((len=inputStream.read(buffer))!=-1){ fos.write(buffer,0,len); } fos.close(); inputStream.close(); urlConnection.disconnect();//断开连接 } }