- socket的引入
TCP协议的确很复杂, 我们不能要求每个程序员都去实现建立连接的3次握手, 累积确认,分组缓存, 这些应该是属于操作系统内核的部分, 没必要重复开发, 但是对于应用程序来讲, 操作系统需要抽象出一个概念, 让上层应用去编程。这个概念就是socket。 - socket的五元组
协议(UDP,TCP),客户端IP, 客户端Port, 服务器端IP, 服务器端Port - UDP: 传送速度快,但是容易丢失数据,可以用于视频聊天、语音聊天
- TCP:传送稳定,不会丢失数据,如文件的上传、下载。
- IP:用来唯一标识我们自己的电脑,是一个网络标识。
- 端口号Port:用来区别当前电脑的应用程序。
- TCP客户端和服务端通信
- 客户端:创建一个socket,然后向服务器发起连接,连接上以后就可以发送,接收数据。
- 服务端: 第一, 服务器是被动的, 所以它启动以后, 需要监听客户端发起的连接, 第二, 服务器要应付很多的客户端发起连接, 所以它通过服务端会可以自动给客户端分配IP, 也可以自动分配端口,将各个socket给区分开了。
/*
* TCP 客户端
*
* 1,创建客户端Socket对象,(指定要连接的服务器地址与端口号)
* 2,获取服务器端的反馈回来的信息
* 3,关闭流资源
*/
public class TCPClient {
public static void main(String[] args) throws IOException {
//1,创建客户端Socket对象,(指定要连接的服务器地址与端口号)
Socket s = new Socket("192.168.74.58", 8888);
//2,获取服务器端的反馈回来的信息
InputStream in = s.getInputStream();
//获取获取流中的数据
byte[] buffer = new byte[1024];
//把流中的数据存储到数组中,并记录读取字节的个数
int length = in.read(buffer);
//显示数据
System.out.println( new String(buffer, 0 , length) );
//3,关闭流资源
in.close();
s.close();
}
}
/*
* TCP 服务器端
*
* 1,创建服务器ServerSocket对象(指定服务器端口号)
* 2,开启服务器了,等待客户端的连接,当客户端连接后,可以获取到连接服务器的客户端Socket对象
* 3,给客户端反馈信息
* 4,关闭流资源
*/
public class TCPServer {
public static void main(String[] args) throws IOException {
//1,创建服务器ServerSocket对象(指定服务器端口号)
ServerSocket ss = new ServerSocket(8888);
//2,开启服务器了,等待客户端的连接,当客户端连接后,可以获取到连接服务器的客户端Socket对象
Socket s = ss.accept();
//3,给客户端反馈信息
/*
* a,获取客户端的输出流
* b,在服务端端,通过客户端的输出流写数据给客户端
*/
//a,获取客户端的输出流
OutputStream out = s.getOutputStream();
//b,在服务端端,通过客户端的输出流写数据给客户端
out.write("你已经连接上了服务器".getBytes());
//4,关闭流资源
out.close();
s.close();
//ss.close(); 服务器流 通常都是不关闭的
}
}
欢迎关注微信公众号,获取更多资源
