java编写聊天程序_Java实现一个简单的网络聊天程序

本文详细介绍了TCP通信的基本概念,包括三次握手建立连接的过程。在Java中,通过Socket和ServerSocket类实现TCP通信,客户端创建Socket对象发起连接,服务端通过ServerSocket接收连接并进行数据交换。同时,文章还提供了简单的Java代码示例来展示TCP通信的过程,并简要提到了Linux下的socket API函数。
摘要由CSDN通过智能技术生成

一.TCP通信概述

TCP协议是面向连接的通信协议,在传输数据之前,发送端和接收端必须建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。

在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过三次握手。

三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。

·第一次握手,客户端向服务器端发出连接请求,等待服务器确认。

·第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。

·第三次握手,客户端再次向服务器端发送确认信息,确认连接。

完成三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了。由于这种面向连接的特性,TCP协议可以保证传输数据的安全,因此应用十分广泛。

二.Java中实现TCP通信的常用方法

1.在Java中,提供了两个类用于实现TCP通信程序

·客户端:java.net.Socket类表示。创建Socket对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信。

·服务端:java.net.ServerSocket类表示。创建一个ServerSocket对象,相当于开启一个服务,并等待客户端的连接。

2.Socket类

Socket类:该类实现客户端套接字。

构造方法:

·public Socket(String host,int port):使用该构造方法在创建Socket对象时,会根据参数去连接在指定地址和端口上运行的服务器程序,其中参数host接收的是一个字符串类型的IP地址。

成员方法:

·public int getPort():该方法返回一个int类型对象,该对象是Socket对象与服务器端连接的端口号。

·public InetAddress getLocalAddress():该方法用于获取Socket对象绑定的本地IP地址,并将IP地址封装成InetAddress类型的对象返回。

·public InputStream getInputStream():该方法返回一个InputStream类型的输入流对象,如果该对象是由服务器的Socket返回,就用于读取客户端发送的数据,反之,用于读取服务器端发送的数据。

·public OutputStream getOutputStream():该方法返回一个OutputStream类型的输出流对象,如果该对象是由服务器的Socket返回,就用于向客户端发送数据,反之,用于向服务器端发送数据。

·public void close():该方法用于关闭本次Socket连接,结束本次通信。

·public void shutdownOutput():禁用此套接字的输出流。

3.ServerSocket类

ServerSocket类:该类实现了服务器套接字。

构造方法:

·public ServerSocket(int port):使用该构造方法在创建ServerSocket对象时,可以将其绑定到一个指定的端口上。端口号可以指定为0,此时系统就会分配一个还没有被其他网络程序所使用的端口号。

成员方法:

·public InetAddress getInetAddress():该方法用于返回一个InetAddress对象,该对象中封装了ServerSocket绑定的IP地址。

·public Socket accept():该方法用于等待客户端的连接,在客户端连接之前一直处于阻塞状态,如果有客户端连接就返回一个与之对应的Socket对象。

·public void close():该方法用于关闭本次Socket连接,结束本次通信。

三.Java中TCP通信的过程

1.服务端:启动,创建ServerSocket对象,等待连接。

2.客户端:启动,创建Socket对象,请求连接。

3.服务端:接收连接,调用accept方法,并返回一个Socket对象。

4.客户端:Socket对象,获取OutputStream,向服务端写数据。

5.服务端:Socket对象,获取InputStream,读取客户端发送的数据。

6.服务端:Socket对象,获取OutputStream,向客户端写数据。

7.客户端:Socket对象,获取InputStream,解析回写数据。

8.客户端:释放资源,断开连接。

41ec2e3ee2ca178c05ed1ce98cde5466.png

图.服务器端和客户端通信图

四.代码实现

客户端:

5d8eaf1ac818fafca033f598788ba084.png

服务端:

5b81bd3c3a7900aa3eaac9d5aee82069.png

五.运行结果

fb554876cd522549208e54d87371fa06.png

9a9db4a44f0e558be596fc8c02fe2643.png

客户端与服务端能正常建立通信。

六.linux socket api

·int socket(int _domain,int _type,int _protocal):创建socket对象,此函数执行成功将返回一个打开的socket文件描述符。

·int bind(int _fd,_CONST_SOCKADDR_ARG _addr,socklen_t  _len):绑定本地IP地址与端口。

·int listen(int _fd,int _n):监听网络,执行成功返回0,失败返回-1。

·int connect(int _fd,_CONST_SOCKADDR_ARG _addr,socklen_t  _len):客户端发起连接。

·int accept(int _fd,_SOCKADDR_ARG _addr,socklen_t *_restrict _addr_len):服务器接收连接。

·ssize_t read(int _fd,void *_buf,size_t _nbytes):读socket对象数据。

·ssize_t write(int _fd,_const void *_buf,sie_t _n):向socket对象写入数据。

·ssize_t send(int _fd,_const void *_buf,sie_t _n,int _flags):发送数据。

·ssize_t recv(int _fd,_const void *_buf,sie_t _n,int _flags):接收数据。

·int close(int _fd):关闭socket对象。

·int getsockname(int _fd,_SOCKADDR_ARG _addr,socklen _t  *_restrict_len):获取socket本地及对端信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值