计算机网络编程(二)基础知识JAVA

一:基础知识

了解协议的意义:
网络协议的理解.
1.人与人之间的交流
交流相当于是一种(通讯):依靠语言(中文,英语,日语)
不同的人其组织形式(使用的语言是不同的)
语言本身就是一种协议。语言本身是一种规定
如果没有语言这种协议的话两个人交流可能就互相不能了解彼此的意思,TCP和UDP其实都是差不多的是一种网络之间通信的协议,如果两台电脑都是遵循TCP协议,那么相互传输数据的时候,两台电脑之间才能知道彼此之间的意思。
2.现在看成程序之间的交流(类似于微信,QQ)
数据,在网络编程当中,数据的组织形式就是协议,数据的组织形式:就是相当于一个字段表示怎样的含义,另一个字段表示怎样的含义,因此在发送,回复数据的时候,都需要按照规定好的协议的方式来进行
3.eg:发送一个消息,我规定id是消息的一个编号,第二个消息是消息的性别,(就是根据固定的格式,然后根据格式程序可以获取自己想要的信息)类似于语言的规定
如果没有按照规定协议去做这件事情,那样的话一个数据包发送给电脑,电脑可能没有办法识别
协议的价值:(说话的目的是为了双方为了理解对方的意图)
协议的价值就是为了代表让双方电脑理解数据的含义

1:TCP和UDP的基本概念和常识

在这里插入图片描述

  • 通俗的理解:TCP协议和UDP协议,TCP协议就想当与打电话的过程,当小明给小红打电话的时候,小明说:你在吗?小红说:我在?小明接着说:下面我说个事情请认真听。接下来小明就要传递大量的信息给小红了

  • 这就是简单的三次握手的模型在这里插入图片描述

  • UDP协议就是假如小红在蹲厕所,小明直接就在厕所周围把重要的事情说了一遍,这样小红到底在不在,小红接收的信息是怎样的是不清楚的。因此这样的传输方式很快但是是不安全的。

2:Socket和ServerSocket

在这里插入图片描述我们可以将Socket看成充电的插头,无论是客户端还是服务端都可以通过这个插头获取自己想要的流,进而获取自己想要的信息。
ServerSocket是服务端套接字,当客户端申请向某个端口建立连接的时候,会因为ServerSocket.accept的方法创建自己服务端的Socket套接字

  • 注意当服务器要读取信息,那么就要用服务端的socket进行输入流,对于客户端就是其输出流
  • 当服务端要进行写信息的时候,对于服务端就是输出流,对于客户端就是输入流
    在这里插入图片描述

二:基本的代码实现(从客户端向服务端发送hello的消息)

  • 服务端代码
package com.lk.server0801;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
//服务端在9999端口监听,如果还有一个程序还想连接这个端口,那么就会报错
public class Server {
	public static void main(String[] args) throws IOException {
		//1.在本机的9999端口监听,等待连接
		//细节:要求本机没有其它服务监听9999
		//细节,这个serverSocket可以通过accept,返回多个Socket
		ServerSocket serversocket = new ServerSocket(9999);
		//和Sanner差不太多,会阻塞在这里
		System.out.println("服务端,在9999端口监听,等待连接");
		//2.当没有客户端连接9999端口时,程序会阻塞,等待连接往下执行
		//如果有客户端连接,则会返回一个Socket对象,程序继续
		Socket socket =serversocket.accept();
		System.out.println("socket="+socket.getClass());
		//3.通过Socket.getInputStream()读取客户端写入到数据通道的数据,显示
		InputStream is = socket.getInputStream();
		BufferedReader br = new BufferedReader(new InputStreamReader(is));
		String s = br.readLine();
		System.out.println(s);
		//关闭流和
		is.close();
		socket.close();
		serversocket.close();
	}
	
}

服务端的输出消息
在这里插入图片描述

  • 客户端代码
package com.lk.server0801;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
//网络程序难度在于:有客户端和服务端两头,两头都需要自己考虑,这是一个网络,设计到I/O流很关键
//代码的逻辑结构自己一定要明白才行
//如果I/O流读取不到内容也会阻塞在哪里的,会在哪里等待读入或者写入联合公报,

//客户端
public class Client {
	public static void main(String[] args) throws UnknownHostException, IOException {
		//1.连接服务端(ip,端口)
		//连接本机的9999端口,连接成功会返回一个Socket,如果想要连接百度的端口,就需要将百度的域名写在前面
		Socket socket = new Socket(InetAddress.getLocalHost(),9999);
		System.out.println("客户端Socket返回="+socket.getClass());
		//2.连接上后,生成Socket,通过socket.getOutputStream得到和Socket对象关联的输出流对象
		OutputStream outputStream = socket.getOutputStream();
		outputStream.write("hello,server".getBytes());
		//4.关闭流对象和Socket
		outputStream.close();
		socket.close();
		
		
	}  
}

客户端的输出消息
在这里插入图片描述

  • 注意读写操作和输出输出流的读取都是要阻塞的
  • ServerSocket.accept操作也是阻塞操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值