网络编程
1. 网络通信协议
1.1 协议和七层模型
七层模型,也称为OSI(Open System Interconnection)参考模型,是国际标准化组织(ISO)制定的一个用于计算机或通讯系统间互联的标准体系。它是一个七层的、抽象的模型体,不仅包括一系列抽象的术语或概念,也包括具体的协议。 ISO 就是 Internationalization Standard Organization(国际标准组织)。
其中,处理服务器端通信的ServerSocket类,其常见构造如下:
构造方法 | 说明 |
---|---|
ServerSocket() | 创建一个ServerSocket对象 |
ServerSocket(int port) | 创建一个ServerSocket对象,并绑定到指定端口 |
ServerSocket常用方法如下:
常用方法 | 说明 |
---|---|
Socket accept() | 侦听并接收到此ServerSocket的连接,此方法在连接传入之前一直阻塞 |
void close() | 使服务器释放占用的资源,并断开所有与客户端的连接 |
InetAddress getInetAddress() | 返回当前服务器绑定的IP地址信息 |
处理客户端通信的Socket类:
Socket的构造共有9种,这里介绍2种常用的构造方法:
构造方法 | 说明 |
---|---|
Socket(String host, int port) | 向host主机的port端口发起连接请求 |
Socket(String host, int port, InetAddress localAddr, int localPort) | 向host主机的port端口发起连接请求,发起请求的计算机为localAddr,端口为localPort |
注意:InetAddress类表示互联网协议地址,包含IP地址,实际上就是java对IP地址的封装。
Socket的常用方法:
常用方法 | 说明 |
---|---|
InetAddress getInetAddress() | 返回与当前Socket对象关联的InetAddress对象 |
void shutdownInput() | 此套接字的输入流置于“流的末尾” |
void shutdownOutput() | 禁用此套接字的输出流 |
InputStream getInputStream() | 返回当前Socket对象关联的InputStream对象,它是服务器端向客户端发送回来的数据流. |
OutputStream getOutputStream() | 返回当前Socket 对象关联的OutputStream对象,它是客户端想服务器端发送的数据流 |
void close() | 关闭该socket建立的连接 |
2.2.1 服务端编程
服务器实现代码如下:
package cn.gl.no1;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服务端
* @author Administrator
*
*/
public class Server {
public static void main(String[] args) {
ServerSocket server = null;
Socket socket = null;
try {
//准备服务器端用的通讯对象(套接字),指明端口号为8888
server = new ServerSocket(8888);
//到指定端口去阻塞监听,一旦有客户端请求发送过来,那么立即自动与客户端建立连接
socket = server.accept();
System.out.println("服务器端准备ok");
//我要发送到客户端的内容
String msg = "你好,我是服务器,这是我的第一次通讯,请问你收到了吗";
OutputStream os = socket.getOutputStream();//准备输出对象
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
bw.write(msg);
bw.newLine();
bw.flush();
//接收客户端发送的信息
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String reply = br.readLine();
System.out.println("我是服务器,接收到信息:"+reply);
br.close();
is.close();
bw.close();
os.close();
socket.close();
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.2.2 客户端实现
客户端实现代码如下:
package cn.gl.no1;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 客户端
* @author Administrator
*
*/
public class Client {
public static void main(String[] args) {
Socket socket = null;
try {
socket = new Socket("localhost", 8888);
System.out.println("客户端准备完成");
//客户端开始接受请求
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String msg = br.readLine();
System.out.println("我是客户端,接收到信息:"+msg);
//客户端接收到服务器端的信息之后,需要反馈信息给服务器
//客户端想要反馈给服务器端的信息
String reply = "我是客户端,收到你的信息,这是我的反馈";
OutputStream os = socket.getOutputStream();//准备客户端的输出流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
bw.write(reply);
bw.newLine();
bw.flush();
bw.close();
os.close();
br.close();
is.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}