Java客户端和服务端连接与单项通信

目录

通过Socket编程顺序:

单项通信:

客户端(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"那么程序退出。

当读取到客户端输入的数据的时候为了更好的验证,我们再把客户端输入的数据通过输出流返回给客户端

Java客户端和服务端连接与单项通信_第1张图片

1、然后我们创建客户端

2、创建客户端Socket对象,并且传递服务端IP以及端口号

3、然后通过Socket对象获取输入输出流并转化为字符流,以键盘的输入作为输出到服务端口的数据

4、然后我们循环读取键盘的输入并输出到服务端(注意这里一定要flush,不然输出不出来我们可以通过api文档查看对flush方法的解读)

Java客户端和服务端连接与单项通信_第2张图片

Java客户端和服务端连接与单项通信_第3张图片

 验证单向通信:

此时我们先运行服务端,此时服务端已启动,并且等待客户端的连接,刚刚已经说过了监听器在监听端口的时候会导致线程阻塞:

Java客户端和服务端连接与单项通信_第4张图片

 然后我们启动客户端,并且再看看客户端和服务端的输出:

此时我们可以看到客户端已经启动并且再等待我们的输入,刚刚我们讲过了输入流会导致线程阻塞,当我们输入数据过后才会回到就绪状态,而服务端也在等待客户端的输入才会输出所以也导致了线程阻塞

Java客户端和服务端连接与单项通信_第5张图片 Java客户端和服务端连接与单项通信_第6张图片

 当我们在客户端输入过后 Java客户端和服务端连接与单项通信_第7张图片

Java客户端和服务端连接与单项通信_第8张图片

 总结:TCP是一个双方连接的过程,必须要双方都连接上了才允许传输数据,大家可以记下这张图或者根据逻辑推理一下,Socket编程的顺序,先有服务端再有客户端,因为没有服务端客户端和谁连接呢?

Java客户端和服务端连接与单项通信_第9张图片

你可能感兴趣的:(java,网络,服务器,开发语言,jvm)