- CS,一对一,专门的客户端 对 服务端,比如 QQ 或者吃鸡 都是CS,
- 缺点更新麻烦,如果QQ更新了,QQ客户端需要更新,不能新可能不能用
- BS,多对一,就是浏览器 对服务端,更新方便,所有的素材都在服务端,比较通用
- 客户端服务端通讯交互的话,需要规则,就是协议,socket就是传输协议,也就是通讯协议
- 可靠传输协议TCP,我给你发送的东西100%能发到,勤拿少许,拆开拿,分成一段一段,传输慢,你拿到了告诉我,我再给你,不是一口气都给你
- 不可靠传输协议UDP,我给你发送的东西不能100%发送,也是勤拿少许,只不过,我给你了,不管你拿没拿到,我都给你,魔兽被闷棍,游戏卡了,死了,没看到,这是就典型的UDP现象,丢一针卡一针无所谓,速度快,
- BS交互的协议是Htpp协议,而Htpp协议底层要求的就是可靠传输协议TCP协议
- java.net.Socket套接字
- Socket封装了TCP协议的通讯细节
- 使用它可以与服务端建立网络连接
- 通过它获取两个流(一个输入,一个输出),然后使用这两个流的读写操作完成与服务端的数据交互
- 运行在服务端的ServerSocket主要有两个作用
- 向系统申请服务端口,客户端的Socket就是通过这个端口与服务端建立连接的
- 监听服务端口,一旦一个客户端通过该端口建立连接会自动创建一个Socket,(交互一个创建一个)
- 客户端
package socket;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
/**
* 聊天室客户端
*
*/
public class Client {
/**
* java.net.Socket套接字
* Socket封装了TCP协议的通讯细节,使得我们使用它可以与服务端建立网络连接,并通过它获取两个流
* (一个输入,一个输出),然后使用这两个流的读写操作完成与服务端的数据交互
*/
private Socket socket;
/**
* 构造方法,用来初始化客户端
*/
public Client() {
/**
* 实例化Socket时,通常需要传入两个参数:
* 参数1:服务端的地址信息(IP地址,如果连接本机则可用localhost)
* 参数2:服务端打开的服务端口,即:服务端ServerSocket申请的端口
*
* socket实例化的过程就是连接服务端的过程,
* 如果指定的地址与服务端口对应的服务端没有启动,或者输入信息有误就会导致无法连接
*
* 会抛出异常提示拒绝连接:Connection refused: connect
* 注意:导致这个问题还有一种情况,服务端机器没有关闭防火墙
*
*/
try {
System.out.println("正在连接服务端...");
//Socket 创建的过程,就是连接的过程
socket = new Socket("localhost",8088);
System.out.println("与服务端成功建立连接...");
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 客户端开始工作的方法
*/
public void start(){
//客户端启动后,先启动一个线程,用于读取服务端发送过来的消息
Runnable sh = new ServerHandler();
Thread thread = new Thread(sh);
thread.start();
/*
*Socket 提供方法:
* OutputStream getOutputStream()
* 该方法会获取一个字节输出流,通过这个输出流写出的字节数据会通过网络发送给对方
*/
try(
/*
Socket提供的方法:
OutputStream getOutputStream()
该方法会获取一个字节输出流,通过这个输出流写出的字节数据会通过网络
发送给对方。
*/
OutputStream out = socket.getOutputStream();
PrintWriter pw = new PrintWriter(//高级流,按行写ÿ