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的更多相关文章
-
java学习之tcp与udp的实现
package com.gh.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.Inp ...
-
JAVA基础知识|TCP/IP协议
虽然写代码也有一定的年头了,但是对于一些基础概念,还是很模糊.这在后来的学习过程中,带来了很大的痛苦,所以痛定思痛,决心重新学习这些概念.并把自己的理解和查询的资料做一些整合,便于以后查阅! 一.什么 ...
-
计算机网络基础:TCP和UDP
UDP(用户数据报协议) 应用场景:一个数据包就能完成数据通信:不需要建立会话和流量控制:多播.广播:是一种不可靠传输.(例如QQ聊天,屏幕广播) UDP协议特点: UDP是无连接的,即发送数据之前不 ...
-
【JAVA网络流之TCP与UDP 】
一.ServerSocket java.lang.Object |-java.net.ServerSocket 有子类SSLServerSocket. 此类实现服务器套接字.服务器套接字等待请求通过网 ...
-
java基础篇---网络编程(UDP程序设计)
UDP程序设计 在TCP的索引操作都必须建立可靠地连接,这样一来肯定会浪费大量的系统性能,为了减少这种开销,在网络中又提供了另外一种传输协议---UDP,不可靠的连接,这种协议在各个聊天工具中被广泛的 ...
-
Java中的TCP/UDP网络通信编程
127.0.0.1是回路地址,用于测试,相当于localhost本机地址,没有网卡,不设DNS都可以访问. 端口地址在0~65535之间,其中0~1023之间的端口是用于一些知名的网络服务和应用,用户 ...
-
JAVA基础知识|Socket
一.什么是Socket? Socket本身并不是协议,是一套完成TCP.UDP协议的调用接口(API),通过socket我们才能使用TCP/IP协议(JAVA基础知识|TCP/IP协议).Socket ...
-
【Python网络编程】利用Python进行TCP、UDP套接字编程
之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验. 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接 ...
-
JAVA基础学习day24--Socket基础一UDP与TCP的基本使用
一.网络模型 1.1.OIS参考模型 1.2.TCP/IP参考模型 1.3.网络通讯要素 IP地址:IPV4/IPV6 端口号:0-65535,一般0-1024,都被系统占用,mysql:3306,o ...
随机推荐
-
多线程之信号量(By C++)
信号量在多线程中,主要是用于线程的同步或者限制线程运行的数量. 所谓同步,当流程1运行在线程1中,流程2运行在线程2中,流程2必须在流程1结束之后才能开始执行.你会怎么做,所有就需要给出一个流程1结束 ...
-
Sql Server系列:嵌套查询
嵌套查询是指一个查询语句嵌套在另一个查询语句内部的查询.嵌套查询也就子查询,在SELECT子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或多个表.子查询中可以使用比较运 ...
-
获取select标签的值
1.设置value为pxx的项选中 $(".selector").val("pxx"); 2.设置text为pxx的项选中 $(".selector& ...
-
多媒体(4):JPEG图像压缩编码
(重要的事放前面)此JPEG的C++实现见 https://github.com/chencjGene/SoftEngineering/tree/master/JPEG 目录 多媒体(1):MCI接口 ...
-
JQuery.Ajax之错误调试帮助信息介绍
下面是Jquery中AJAX参数详细列表: timeout Number 设置请求超时时间(毫秒).此设置将覆盖全局设置. async Boolean (默认: true) 默认设置下,所有请求均为异 ...
-
匹配“is outside location”
<pre name="code" class="html">is outside location 怎么匹配? . 匹配除换行外的所有单个字符,通常 ...
-
the C programming language 阅读笔记2
1. 指针 1.1 自增符的使用 ++*p;//p指向的内容加一 (*p)++; //p指向的内容加一 *p++;//p本身自增 *++p; //p本身自增 因为诸如*和++这样的一元运算符在表达式求 ...
-
模板引擎(smarty)知识点总结
首先我们必须知道使用smarty的流程 1.引入 2.实例化 3.配置 模板目录 编译目录 3.0版本 支持不存在的目录则新建 4.赋值 5.编译显示 某个模板文件(暗示需要哪 ...
-
小白的Python之路 day5 shutil模块
shutil模块 一.主要用途 高级的文件.文件夹.压缩包 等处理模块 二.常用方法详解 1.shutil.copyfileobj(fsrc, fdst) 功能:把一个文件的内容拷贝到另外一个文件中, ...
-
【机器学习】使用gensim 的 doc2vec 实现文本相似度检测
环境 Python3, gensim,jieba,numpy ,pandas 原理:文章转成向量,然后在计算两个向量的余弦值. Gensim gensim是一个python的自然语言处理库,能够将文档 ...