java网络编程
java网络编程
1.ip:InetAddress
-
唯一定位一台网络上的计算机
-
127.0.0.1:本机localhost
-
ip地址的分类
-
ipv4/ipv6
- ipv4 0.0.0.0,4个字节组成,每个字节0~255,共有约42亿
- ipv6 x.x.x.x.x.x.x.x ,128位,8个无符号整数
-
公网/私网
- ABCD类地址
- A类:一个字节的网络地址,三个字节的主机地址地址,最高位为0
- B类:两个字节的网络地址,两个字节的主机地址,最高位为10
- C类:三个字节的网络地址,一个字节的主机地址,最高位为110
- ABCD类地址
-
域名:解决IP记忆问题
-
2.端口
-
不同的进程有不同的端口!用来区分不同的软件
-
规定为0~65535
-
TCP,UDP单个协议下端口号不能冲突
-
端口分类
- 公有端口0~1023
- HTTP:80
- HTTPS:443
- FTP :21
- 程序注册端口:1024~49151,分配用户或者程序
- Tomcat:8080
- mysql:3306
- idea:66432
- 动态,私有:49152~65535
netstat -ano #查看所有的端口
- 公有端口0~1023
3.TCP,UDP对比
-
TCP链接稳定
-
三次握手,四次挥手
-
TCP实现聊天
-
客户端:
-
连接服务器段Socket
- 发送消息
//客户端 import java.io.*; import java.net.Socket; public class ClientDemo { public static void main(String[] args) { Socket socket = null; OutputStream outputStream = null; InputStream inputStream = null; ByteArrayOutputStream arrayOutputStream = null; try { socket = new Socket("127.0.0.1", 6666); //设置网络输入、输出流 outputStream = socket.getOutputStream(); //inputStream = socket.getInputStream(); arrayOutputStream = new ByteArrayOutputStream(); //客户端发送消息 outputStream.write("你好啊!".getBytes()); System.out.println(arrayOutputStream.toString()); } catch (IOException e) { e.printStackTrace(); } finally { //关闭资源 } } }
-
服务器端
- 建立服务的端口 ServerSocket
- 等待用户的链接 accept
- 接收用户的消息
import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class ServerDemo { public static void main(String[] args) { Socket socket = null; OutputStream outputStream = null; InputStream inputStream = null; ByteArrayOutputStream arrayOutputStream = null; try { ServerSocket serverSocket = new ServerSocket(6666); while (true) { socket = serverSocket.accept(); inputStream = socket.getInputStream(); arrayOutputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = inputStream.read(buffer)) != -1) { arrayOutputStream.write(buffer, 0, len); } System.out.println(arrayOutputStream.toString()); } } catch (IOException e) { e.printStackTrace(); } finally { //释放资源 } }
-
-
TCP实现文件上传
-
需要在客户端和服务器端增加本地的管道流
-
需要通知对方发送完流
socket.shutdownOutput()
-
-
UDP发送消息
- 发送端
//建立socket DatagramSocket socket = new DatagramSocket(); //数据,数据的起始位置和长度,发送的ip和端口 DatagramPacket packet = new DatagramPacket(buf[],offset,length,address,port); //发送包
socket.send(packet);
- 接收端
```java
//开放端口
DatagramSocket socket = new DatagramSocket(port);
//接收数据包
DatagramPacket packet = new DatagramPacket(buf[],offset,length);
socket.receive(packet);
-
读取控制台的流
new InputStreamReader(System.in)