目录
客户端(Socket)和服务端(ServerSocket)连接的前提是主机之间已经通过TCP协议进行了三次握手,客户端和服务端建立连接的基础是主机之间已经通过TCP协议通信的基础之上的
通过Socket编程顺序:
1、创建服务器ServerSocket,在创建时定义ServerSocket监听端口(在这个端口接收和发送信息)
2、ServerSocket调用accept()方法,此时会返回一个监听器Socket对象,我们可以通过监听器Socket对象获取输入输出流,此时线程将会阻塞,直到与客户端连接才会回到就绪状态
3、创建客户端Socket,并设置服务器IP以及端口号
4、客户端发送请求,建立连接
5、利用Socket和ServerSocket进行数据传输
6、关闭流及Socket
重点:客户端连接服务端时,需要传递服务器IP地址和端口号
而服务端需要给定监听端口
服务器给定监听端口后,需要通过ServerSocket对象调用accept()方法(accept方法会导致线程阻塞,当与客户端连接成功之后该线程才会回到就绪状态),此时会返回一个监听器Socket对象,我们可以通过Socket对象获取输入输出流,而输入输出流会导致线程阻塞,当输入输出过后线程会返回到就绪状态
单项通信:
单项通信是指通信双方中,一方固定为发送端,一方固定为接收端
我们可以通过代码来理解:
1、首先我们根据上面的Socket流程,先创建服务端,因为没有服务端客户端咋建立通信,服务端是基础,创建ServerSocket对象并且传递监听端口为8888,通过ServerSocket对象调用accept()方法进行监听,获取监听器对象
2、然后通过监听器对象获取输入输出流对象,并且通过转换流将字节流转为字符流
3、然后我们循环读取服务端传递的数据,一次读一行并且输出,当客户端发送的数据为"exit"那么程序退出。
当读取到客户端输入的数据的时候为了更好的验证,我们再把客户端输入的数据通过输出流返回给客户端
1、然后我们创建客户端
2、创建客户端Socket对象,并且传递服务端IP以及端口号
3、然后通过Socket对象获取输入输出流并转化为字符流,以键盘的输入作为输出到服务端口的数据
4、然后我们循环读取键盘的输入并输出到服务端(注意这里一定要flush,不然输出不出来我们可以通过api文档查看对flush方法的解读)
验证单向通信:
此时我们先运行服务端,此时服务端已启动,并且等待客户端的连接,刚刚已经说过了监听器在监听端口的时候会导致线程阻塞:
然后我们启动客户端,并且再看看客户端和服务端的输出:
此时我们可以看到客户端已经启动并且再等待我们的输入,刚刚我们讲过了输入流会导致线程阻塞,当我们输入数据过后才会回到就绪状态,而服务端也在等待客户端的输入才会输出所以也导致了线程阻塞
当我们在客户端输入过后