JavaSocket: 基于TCP协议下的套接字编程

Socket也叫套接字
Socket编程也叫套接字编程,也叫网络编程。

服务端
1.创建一个服务端socket(ServerSocket),指定监听的端口号
2.监听并接收客户端的连接。 Socket c = ss.accept();
3.读取数据。 InputStream is = c.getInputStream(); 读取数据
4.使用数据 例如:存储,打印
5.关闭socket(c)

//服务端:
	public static void main(String[] args) throws Exception {
		//服务端监听11111端口
		ServerSocket ss = new ServerSocket(11111);
		Socket s = ss.accept();
		Thread t = new Thread() {
			@Override
			public void run() {
				synchronized(this) {
					try (
							InputStream is= s.getInputStream();
							BufferedInputStream bis = new BufferedInputStream(is);
							OutputStream os = s.getOutputStream();
							BufferedOutputStream bos = new BufferedOutputStream(os)
									;){
						int length = 0;
						byte[] b = new byte[1024];
						while((length = bis.read(b)) != -1) {
							bos.write(b, 0, length);
						}
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					try {
						ss.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		};
		t.start();
	}

客户端
1.创建一个客户端socket(Socket),指定连接的服务器的ip地址和端口号
2.获取输出流 OutputStream os = s.getOutputStream();
3.写数据 os.write(xxx);
4.关闭socket

//客户端:
public static void main(String[] args) {
	//找到文件地址,发给服务端:
	getChoose11("C:\\Users\\Desktop\\Java异常处理.txt");
}

public static void getChoose11(String s) {

	try (
			FileInputStream fis = new FileInputStream(s);
			BufferedInputStream bis = new BufferedInputStream(fis);
			//连接服务端电脑:
			Socket s1 = new Socket("10.10.12.92", 8088);
			OutputStream os = s1.getOutputStream();
			BufferedOutputStream bos = new BufferedOutputStream(os);
			){

		byte[] b = new byte[1024];
		int length = 0;
		while((length = bis.read(b)) != -1) {
			bos.write(b, 0, length);
		}

	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

包括Socket在内的5层通讯流程

在这里插入图片描述

Socket编程中, 运输层主要遵守以下两种协议:

传输控制协议 TCP(Transmisson Control Protocol): 提供面向连接的, 安全可靠的, 全双工数据传输服务
用户数据协议 UDP(User Datagram Protocol): 提供无连接的, 不一定安全可靠的, 半双工数据传输服务

UDP 的主要特点:
1. UDP 是无连接的;
2. UDP 使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态(这里面有许多参数);
3. UDP 是面向报文的;
4. UDP 没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如 直播,实时视频会议等);
5. UDP 支持一对一、一对多、多对一和多对多的交互通信;
6. UDP 的首部开销小,只有8个字节,比TCP的20个字节的首部要短。
TCP 的主要特点:
1. TCP 是面向连接的。(就好像打电话一样,通话前需要先拨号建立连接,通话结束后要挂机释放连接);
2. 每一条 TCP 连接只能有两个端点,每一条TCP连接只能是点对点的(一对一);
3. TCP 提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达;
4. TCP 提供全双工通信。TCP 允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接收缓存,用来临时存放双方通信的数据;
5. 面向字节流。TCP 中的“流”(Stream)指的是流入进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和 TCP 的交互是一次一个数据块(大小不等),但 TCP 把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。

TCP协议下的三次握手:

在这里插入图片描述

TCP协议下的四次挥手:

在这里插入图片描述

嗯…说人话:

三次握手:

李四看到张三向自己招手后,向对方点了点头挤出了-一个微笑(ack)。张三看到李四微笑后确认了李四成功辨认出了自己(进入estalished状态)。但是李四还有点狐疑,向四周看了-看,有没有可能张三是在看别人呢,他也需要确认一下。所以李四也向张三招了招手(syn),张三看到李四向自己招手后知道对方是在寻求自己的确认,于是也点了点头挤出了微笑(ack),李四看到对方的微笑后确认了张三就是在向自己打招呼(进入established状态)。于是两人加快步伐,走到了一起,相互拥抱。

四次挥手:

张三挥手(fin)---->李四伤感地微笑(ack)----> 李四挥手(fin)----> 张三伤感地微笑(ack)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值