OSI 7层参考模型

物理层 --> 数据链路层 --> 网络层 --> 传输层 --> 会话层 --> 表示层 --> 应用层

按此顺序称为拆包,反之为封包。

TCP/IP参考模型

主机至网络层 --> 网际层 --> 传输层 --> 应用层

IP地址:127.0.0.1默认IP,主机名是localhost,每台PC都有的

端口号:应用程序的标识

传输协议:TCP/UDP

  • UDP:不需建立连接,速度快,不可靠,可能丢包,如对讲机。可以及时通信而不管对方在不在。
  • TCP:需要建立连接。三次握手,效率稍低,可靠。不在后,停止传输。比如打电话,下载数据。

Socket:数据在两个Socket之间通过I/O传输,通信两方都有。

TCP传输中:有一个客户端(client),有一个服务端(server),两方传输经过Socket。Socket是底层建立好了的,既可以输入又可以输出。

UDP传输例子

发送端

// 发送端
package Test;

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;
// 实现Runnable并覆盖run方法实现多线程
public class Send implements Runnable {
    private DatagramSocket ds;
    // 发送端和接收端都有各自的Socket来传输
    public Send(DatagramSocket ds) {
        this.ds = ds;
    }

    @Override
    public void run() {
        System.out.println("发送端启动");

        try {
          // 从键盘读入
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String line;
            while ((line = br.readLine()) != null) {
              // 读到的字符变成字节数组
                byte[] buf = line.getBytes();
              // 数据打包,传入ip地址和端口
                DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("10.175.214.114"), 10005);
              // 通过Socket传输数据包
                ds.send(dp);
              // 发送端输入88,就下线
                if (line.equals("88")) {
                    System.out.println("退出聊天");
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            ds.close();
        }

    }
}

接收端

package Test;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class Rec implements Runnable {
    private DatagramSocket ds;

    public Rec(DatagramSocket ds) {
        this.ds = ds;
    }

    @Override
    public void run() {
        System.out.println("接收端启动");

        try {
            while (true) {
                byte[] buf = new byte[1024];
                DatagramPacket dp = new DatagramPacket(buf, buf.length);
              // 这个Socket指定端口号,就能收到发送端发过来的数据
                ds.receive(dp); // 阻塞式的,等待

                String ip = dp.getAddress().getHostAddress();
                int port = dp.getPort();
                String text = new String(dp.getData(), 0, dp.getLength());
                System.out.println(ip + ":" + port + ":" + text);
                if (text.equals("88")) {
                    System.out.println(ip + ": 退出聊天室");
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            ds.close();
        }
    }
}

运行试试

package Test;

import java.net.DatagramSocket;
import java.net.SocketException;

public class UDPDemo {
    public static void main(String[] args) throws SocketException {
      // 接收端和发送端有各自的Socket
        DatagramSocket se = new DatagramSocket();
        DatagramSocket re = new DatagramSocket(10005);
        new Thread(new Rec(re)).start();
        new Thread(new Send(se)).start();
    }
}

TCP传输例子

客户端

package Test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class TransClient {
    public static void main(String[] args) throws IOException {
        Socket s = new Socket("10.175.160.121", 10003);
        // 读取键盘输入
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // 获取socket输出流,写给服务端
        PrintWriter out = new PrintWriter(s.getOutputStream(), true);

        String line;
        // socket输入流,读取服务端发来的
        BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
      // 从键盘读取后写给服务端
        while ((line = br.readLine()) != null) {
            if (line.equals("over"))
                break;
            out.println(line);
            // 读取服务端发回的大写字母
            String uper = bufIn.readLine();
            System.out.println(uper);
        }
        s.close();
    }
}

服务端

package Test;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class TransServer {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(10003);
        // 接收从客户端发来的socket
        Socket socket = ss.accept();
        // 获取ip
        String ip = socket.getInetAddress().getHostAddress();
        // 获取socket读取流
        BufferedReader bufr = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        // socket输出流,将大写后的写到客户端
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        String line;
        while ((line=bufr.readLine()) != null) {
          // 服务端打印从客户端发来的数据
            System.out.println(line);
          // 服务端发送给客户端转化大写后的数据
            out.println(line.toUpperCase());
        }
        socket.close();
        ss.close();
    }
}

by @sunhaiyu

2016.1.13

Java基础之TCP与UDP的更多相关文章

  1. java学习之tcp与udp的实现

    package com.gh.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.Inp ...

  2. JAVA基础知识|TCP/IP协议

    虽然写代码也有一定的年头了,但是对于一些基础概念,还是很模糊.这在后来的学习过程中,带来了很大的痛苦,所以痛定思痛,决心重新学习这些概念.并把自己的理解和查询的资料做一些整合,便于以后查阅! 一.什么 ...

  3. 计算机网络基础:TCP和UDP

    UDP(用户数据报协议) 应用场景:一个数据包就能完成数据通信:不需要建立会话和流量控制:多播.广播:是一种不可靠传输.(例如QQ聊天,屏幕广播) UDP协议特点: UDP是无连接的,即发送数据之前不 ...

  4. 【JAVA网络流之TCP与UDP 】

    一.ServerSocket java.lang.Object |-java.net.ServerSocket 有子类SSLServerSocket. 此类实现服务器套接字.服务器套接字等待请求通过网 ...

  5. java基础篇---网络编程(UDP程序设计)

    UDP程序设计 在TCP的索引操作都必须建立可靠地连接,这样一来肯定会浪费大量的系统性能,为了减少这种开销,在网络中又提供了另外一种传输协议---UDP,不可靠的连接,这种协议在各个聊天工具中被广泛的 ...

  6. Java中的TCP/UDP网络通信编程

    127.0.0.1是回路地址,用于测试,相当于localhost本机地址,没有网卡,不设DNS都可以访问. 端口地址在0~65535之间,其中0~1023之间的端口是用于一些知名的网络服务和应用,用户 ...

  7. JAVA基础知识|Socket

    一.什么是Socket? Socket本身并不是协议,是一套完成TCP.UDP协议的调用接口(API),通过socket我们才能使用TCP/IP协议(JAVA基础知识|TCP/IP协议).Socket ...

  8. 【Python网络编程】利用Python进行TCP、UDP套接字编程

    之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验. 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接 ...

  9. JAVA基础学习day24--Socket基础一UDP与TCP的基本使用

    一.网络模型 1.1.OIS参考模型 1.2.TCP/IP参考模型 1.3.网络通讯要素 IP地址:IPV4/IPV6 端口号:0-65535,一般0-1024,都被系统占用,mysql:3306,o ...

随机推荐

  1. python 标准库 -- requests

    一. 安装 $ pip install requests requests 并不是python 标准库, 但为了汇总方便, 将其放置于此. 二. 用法 requests.get() : GET 请求 ...

  2. PHP+MySql实现后台数据的读取

      我们使用的是PHP 的php_mysqli扩展   首先了解一些基础的用法  1.连接数据库使用 mysqli_connect()  参数:①主机地址 ②MYSQL用户名 ③MYSQL密码 ④选择 ...

  3. Javaee需不需要培训?培训完可以顺利找到工作吗?

    Javaee需不需要培训?培训完可以顺利找到工作吗? 在IT行业中Java以它通用性.高效性.平台移植性和安全性遍布各个领域,它的火热也给IT市场发展带来一定影响,随着Java技术的广泛运营,企业对J ...

  4. Vulkan Tutorial 23 Descriptor layout and buffer

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 我们现在可以将任意属性传递给每个顶点的顶点着色器使用.但是 ...

  5. 安装Dubbo注册中心(Zookeeper-3.4.6)

    样例视频教程:http://www.roncoo.com/course/view/f614343765bc4aac8597c6d8b38f06fd Dubbo建议使用Zookeeper作为服务的注册中 ...

  6. 两种代理模式(JDK和Cglib)实例

    CGlib代理模式: package CGLIB; import java.lang.reflect.Method; import JDK.Test; import net.sf.cglib.prox ...

  7. css画三角形,梯形

    (根据调节边框的宽度来调节三角形形状) <!DOCTYPE html> <html> <head> <meta http-equiv="Conten ...

  8. java程序员常见面试题目

      答:每当程序出现异常之后,如果程序没有进行相应的处理,则程序会出现中断现象.实际上,产生了异常之后,JVM会抛出一个异常类的实例化对象,如果此时使用了try语句捕获的话,则可以进行异常的处理,否则 ...

  9. TCP 连接重置漏洞 - CVE-2004-0230讲解

    TCP 连接重置漏洞 - CVE-2004-0230: IPv6 实施中存在一个拒绝服务漏洞,该漏洞可能允许攻击者向受影响系统发送特制的 TCP 消息. 成功利用此漏洞的攻击者可能会导致受影响系统重置 ...

  10. Struts2国际化信息机制

    国际化信息机制  (三种 Action范围. Package范围. 全局) 1. 全局国际化配置信息文件 全局国际化文件,对所有Action 生效,任何程序都可以访问到,需要在struts.xml 配 ...