网络

2018-10-15  本文已影响0人  咔狼

网络协议

由于以太网最大的数据帧是1518Bytes,刨去以太网帧的帧头(DMAC目的MAC地址48bits=6Bytes+SMAC源MAC地址48bits=6Bytes+Type域2Bytes)14Bytes和帧尾CRC校验部分4Bytes,剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes,这个值我们就把它称之为MTU。

UDP 包的大小就应该是 1500 - IP头(20) - UDP头(8) = 1472(Bytes)
TCP 包的大小就应该是 1500 - IP头(20) - TCP头(20) = 1460(Bytes)

UDP
TCP

端口:一个端口只能同时被一个程序使用(有效范围 0 - 65535,动态范围 1024 - 65535)

IP地址对象

InetAddress 方法
具体见 Java API (~ ̄▽ ̄)~

static InetAddress[] getAllByName(String host)
static InetAddress getByAddress(byte[] addr)
static InetAddress getByAddress(String host,byte[] addr)
static InetAddress getByName(String host)
static InetAddress getLocalHost()

UDP实例

发送端

DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);// 构建发送数据包
DatagramSocket socket = new DatagramSocket(localPort);// 指定本地端口号(留空则随机端口号)
socket.send(packet);// 发送数据包

接收端

byte[] buf = new byte[1472];// UDP报文最大长度
DatagramPacket packet = new DatagramPacket(buf, buf.length);// 构建接收数据包
DatagramSocket socket = new DatagramSocket(localPort);// 指定本地端口号
socket.receive(packet);// 等待并接收数据包

byte[] returnBuf = new byte[packet.getLength()];// 构建返回的数据
System.arraycopy(buf, 0, returnBuf, 0, returnBuf.length);// 将收到的数据从缓冲区转移并返回

TCP实例

客户端

Socket socket = new Socket(remoteHostAddress, remoteHostPort);// 构建连接到远程主机的套接字
PrintWriter pout = new PrintWriter(socket.getOutputStream(), true);// 使用打印流, 开启自动刷新缓冲
BufferedReader pin = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 使用缓冲读取流

BufferedReader keyboardInput = new BufferedReader(new InputStreamReader(System.in));// 读入键盘数据
String buffer;
while (true)  {
    if (! "quit".equals(buffer = keyboardInput.readLine())) {// 输入quit退出
        pout.println(buffer);// 将键盘数据打印到服务端
        if ((buffer = pin.readLine()) != null) {
            System.out.println(buffer);// 打印服务端返回数据
        }
    }
}

服务端

ServerSocket serverSocket = new ServerSocket(localHostPort);// 建立服务端套接字
Socket socket = serverSocket.accept();// 得到套接字对象
BufferedReader bufIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 使用缓冲读取流(读到换行符为一行)
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);// 使用打印流

String line;
while ((line = bufIn.readLine()) != null) {
    System.out.println(line);// 打印客户端发来的数据
    out.println("Received:"+line);// 返回数据给客户端
}
上一篇 下一篇

猜你喜欢

热点阅读