一、建立简单的服务器
Java中建立一个简单的服务器需要5个步骤:
(1)创建一个ServerSocket对象。
eg. ServerSocket server=new ServerSocket(5776,100);
(2)通过调用ServerSocket的accept方法等待客户端连接;若连接建立,则返回一个Socket对象,并通过该对象管理每个客户端连接。
eg. Socket connection=server.accept();
(3)获得OutputStream和InputStream对象, 通过发送和接收字节,使服务器能与客户端通信。
(4)处理阶段,服务器和客户端通过OutputStream和InputStream对象通信。
(5)传输完成时,服务器对流和Socket调用close方法,关闭连接。
二、建立简单的客户端
Java中建立简单的客户端需要4个步骤:
(1)需创建一个连接到服务器的Socket,可使用Socket的构造函数,将其连接到服务器上。
eg. Socket connection=new Socket( serverAddress, port); //创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
(2)客户端使用Socket的方法 getOutputStream/getInputStream, 分别获得输出/输入流引用。 也可套接其他输入输出流类,增强其输入输出功能。
(3)处理阶段,服务器和客户端使用OutputStream和InputStream对象引用进行通信。
(4)当传输完成时,客户端会对流和Socket 调用close方法,关闭连接。
三、 服务器程序与客户端程序的区别:
服务器程序绑定到特定的端口来使用 ServerSocket对象。ServerSocket如同创建客户端连接的工厂。
四、TCP和UDP区别
TCP提供一个可靠的传输模型作为两个网络端点的字节流,有纠错能力.
UDP没有保持的连接和数据流,数据报是一 个网络上发送的独立信息,它的到达时间、以及内容不能得到保证。
五、无连接的客户/服务器编程
Java中DatagramSocket类使用UDP协议,在用户和服务器间发送信息包。数据包套接字主要包括以下两个类:
(1)DatagramPacket:表示要发送/接收的信息组成的数据包。
(2)DatagramSoket:表示客户和服务器之间 的套接字,用于发送和接收数据包 ( DatagramPacket )。
异常:java.net.SocketException
六、创建数据包: DatagramPacket
用于包装接收信息的数据包:
DatagramPacket(byte[] buffer, int length) //构造 DatagramPacket,用来接收长度为 length 的数据包 length 的数据包
用于包装发送信息的数据包: DatagramPacket(byte[] buffer, int length, InetAddress add, int port) //构造数据报包,用来将长度为 length 的包发 送到指定主机上的指定端口号。
七、创建数据包套接字:DatagramSocket
使用构造函数:
Client端: DatagramSocket()// 一般客户端不需要指定特定的端口号,因为服务器接收到客户端的端口号包含于客户端发送的 DatagramPacket中
Server端: DatagramSocket(int port)//绑定服务端指定端口号
发送和接收数据包的基本方法:
DatagramSocket .send(DatagramPacket dgp)
DatagramSocket .receive(DatagramPacket dgp)
八、Server发送/接收报文的标准步骤
(1)定义数据成员
DatagramSocket socket;
DatagramPacket packet;
InetAddress address;(用来存放目的地址)
int port; (用来存放目的端口号)
(2)创建数据报文Socket对象
try {socket=new DatagramSocket(1111);} catch(java.net.SocketException e) {}
socket 绑定到一个本地的可用端口,等待接收客户的请求.
(3)分配并填写数据缓冲区(一个字节类型的数组)
byte[] buf=new byte[256]; //存放从客户端接收的请求信息.
(4)创建一个DatagramPacket用于接收信息
packet=new DatagramPacket(buf, 256); //用来从socket接收数据,它只有两个参数
(5)服务器阻塞 socket.receive(packet); //在客户的请求报道来之前一直等待
(6)从收到的包中得到地址和端口号
InetAddress address=packet.getAddress();
int port=packet.getPort();
(7)将待发送的数据送入缓冲区或来自文件,或键盘输入,放入buf
(8)建立报文包,用来发送信息
packet=new DatagramPacket (buf,buf.length, address,port);
(9)发送数据包 socket.send(packet);
(10)关闭socket socket.close();
九、客户端接收包的步骤
(1)定义数据成员
int port;
InetAddress address;
DatagramSocket socket;
DatagramPacket packet;
byte[] sendBuf=new byte[256];
(2)建立socket socket=new DatagramSocket();
(3)向服务器发出请求报文
address=InetAddress.getByName(args[0]);
port=parseInt(args[1]);
packet=new DatagramPacket(sendBuf,256,address,port); socket.send(packet); //这个包本身带有客户端的信息
(4)客户机等待应答
packet=new DatagramPacket(sendBuf,256);
socket.receive(packet);(如果没有到就一直等待, 因此实用程序要设置时间限度)
(5)处理接收到的数据
String received=new String(packet.getData(),0); System.out.println(received);
十、关于多客户实现方案
第一种解决方案: 一台计算机上一次启动多个服务器程序,只要端口号不同。
第二种方案: 将服务器写成多线程的,不同的线程为不同的客户服务。
server只负责循环等待连接。线程负责网络连接,接收客户输入的信息。