聊天室v1.0

来源:互联网 发布:最优化理论与方法pdf 编辑:程序博客网 时间:2024/06/01 11:27

功能要求:
1.多个客户端可以同时访问服务器。
2.服务器接收客户端发来的消息,并转发给所有的客户端,客户端在输出台显示。
1. 如图1.0
这里写图片描述
2.思路:实现单一客户端通信功能的基础上,完善功能。
3.步骤:
3.1 创建客户端 Client类
3.2 创建socket对象
3.3 创建 void start()启动方法
3.4 创建程序main() 主方法
同理依次创建服务端 Server类———-
4.代码实现:
4.1 用到的知识点:TCP协议 socket通讯模型 多线程 集合 IO流, 异常处理等
TCP协议:
4.1.1
1.面向连接的传输;
  2.端到端的通信;
  3.高可靠性,确保传输数据的正确性,不出现丢失或乱序;
  4.全双工方式传输;
  5.采用字节流方式,即以字节为单位传输字节序列;
  6.紧急数据传送功能。
 4.1.2 socket通讯模型:
 套接字:源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字。其用于标识客户端请求的服务器和服务。

网络通信使用IP地址标识Internet上的计算机,使用端口号标识服务器上的进程(程序)。也就是说,如果服务器上的一个程序不占用一个端口,用户程序就无法找到它,就无法和该程序交互信息。端口号被规定为一个16位的0~65535之间的整数,其中,0~1023被预先定义的服务通信占用(如telnet占用端口 23,http占用端口80等),除非我们需要访问这些特定服务,否则,就应该使用1024~65535这些端口中的某一个进行通信,以免发生端口冲突。
  当两个程序进行通信时,可以通过Socket 类建立套接字对象并连接在一起(端口号与IP地址的组合得出一个网络套接字)

常用的TCP/IP协议的3种套接字
流套接字(SOCK_STREAM):

流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即TCP(The
Transmission Control Protocol)协议。

数据包套接字(SOCK_DGRAM):

数据包套接字提供了一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据包套接字使用UDP(User
Datagram
Protocol)协议进行数据的传输。由于数据包套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。

原始套接字(SOCK_RAW):

原始套接字(SOCKET_RAW)允许对较低层次的协议直接访问,比如IP、
ICMP协议,它常用于检验新的协议实现,或者访问现有服务中配置的新设备,因为RAW
SOCKET可以自如地控制Windows下的多种协议,能够对网络底层的传输机制进行控制,所以可以应用原始套接字来操纵网络层和传输层应用。比如,我们可以通过RAW
SOCKET来接收发向本机的ICMP、IGMP协议包,或者接收TCP/IP栈不能够处理的IP包,也可以用来发送一些自定包头或自定协议的IP包。网络监听技术很大程度上依赖于SOCKET_RAW
原始套接字与标准套接字(标准套接字指的是前面介绍的流套接字和数据包套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据包套接字只能读取UDP协议的数据。因此,如果要访问其他协议发送数据必须使用原始套接字。
现在使用的是第一种—-流套接字。

客户端套接字
客户端的程序使用Scoket类建立负责连接到服务器的套接字。

Socket (String host,int port) 1如:Socket mysocket = new Socket("http://192.168.0.78",2010);1mysocket.getInputStream() 获取输入流,输入流的源和服务器端的一个输出流的目的地刚好相同mysocket.getOutputStream() 获取输出流,输出流的目的地和服务器端的一个输入流的源刚好相同

ServerSocket对象与服务器端套接字

客户端发送请求—–套接字对象1,服务器端接收请求—–套接字对象2

服务器必须建立一个ServerSocket对象,把套接字1和套接字2连接起来,从而达到连接的目的。

ServerSocket构造方法:ServerSocket(int port) port必须和客户端呼叫的端口号相同
try {    ServerSocket serverForClient = new ServerSocket(2010); //端口已经被占用,就会引发IO异常  } catch (IOEcxeption e){}

当服务器端的ServerSocket 对象 ServerForClient 建立后,就可以使用方法 accept()将客户的套接字和服务器端的套接字连接起来

try {    Socket sc = serverForClietn.accept();   } catch(IOException){}

“`

“`这里写图片描述
这里写图片描述
4.1.3 多线程 :两种创建线程的方法:继承Thread 和 实现Runnable接口,同步synchronized安全锁,线程池,阻塞方法。
未完待续……….

原创粉丝点击