网络基础知识
两台计算机进行通讯的三个条件:
- IP地址,协议, 端口号
TCP/IP五层模型
应用层:HTTP,FTP,SMTP,Telnet等
传输层:TCP/IP
网络层
数据链路层:端口
物理层:网线,双绞线,网卡
端口
应用程序与外界进行交流的出口,但是每个功能必须独占一个,不能重复;
端口号范围是0-65535,其中0-1023为系统保留。
Socket实际上就是IP地址+端口号,Socket是网络上运行的程序之间双向通信链路的终结点。
套接字
通过具有唯一标识IP地址和端口构成唯一的套接字,套接字之间通过IO进行数据传输。
JAVA中的网络支持:
- InetAddress:用于标识和获取通信端硬件资源,IP地址。
//通过静态方法获取本机InetAddress实例
InetAddress address =InetAddress.getLocalHost();
3 address.getHostName();//获取计算机名
4 address.getHostAddress();//获取IP地址
5 byte[] bytes = address.getAddress();//获取字节数组形式的IP地址,以点分隔的四部分
6
7 //获取其他主机的InetAddress实例
8 InetAddress address2 =InetAddress.getByName("其他主机名");
9 InetAddress address3 =InetAddress.getByName("IP地址");
URL(Uniform Resource Locator) 统一资源定位符,
表示某网上的地址。用来定位网上资源。
格式 协议:地址使用URL获取资源的网页内容
//使用URL读取网页内容
2 //创建一个URL实例
3 URL url =new URL("http://www.baidu.com");
4 InputStream is = url.openStream();//通过openStream方法获取资源的字节输入流
5 InputStreamReader isr =newInputStreamReader(is,"UTF-8");//将字节输入流转换为字符输入流,如果不指定编码,中文可能会出现乱码
6 BufferedReader br =newBufferedReader(isr);//为字符输入流添加缓冲,提高读取效率
7 String data = br.readLine();//读取数据
8 while(data!=null){
9 System.out.println(data);//输出数据
10 data = br.readerLine();
11 }
12 br.close();
13 isr.colose();
14 is.close();
TCP编程
TCP协议是面向连接的,可靠的,有序的以子节流的方式发送数据,通过三次握手建立安全的连接,形成数据传输通道,在连接中进行大量数据的传输,效率会稍低。
Java中基于TCP协议实现网络通信的类
服务端:ServerSocket。确定在本机的那个端口通信。
客户端:Socket。确定连接到那个服务端,需要IP与端口号。Socket 通信的步骤
1,创建套接字服务端和客户端。
2,服务端开启监听,获取套接字。
3,获取套接字中的输入输出流。
4,按照协议,对套接字进行读写操作。
5,关流,关套接字。- 服务端:
ServerSocket ss = null;
String line = null;
try {
//建立服务端
ss = new ServerSocket(8111);
on:while (true){
//监听,等待客户端连接
Socket socket = ss.accept();
InputStream inputStream = socket.getInputStream();
//读取客户端返回给服务端套接字中流的数据。
InputStreamReader inputStreamReader= new InputStreamReader(inputStream);
//封装成缓冲字符流,读取更方便
BufferedReader br = new BufferedReader(inputStreamReader);
while ((line = br.readLine())!=null) {
System.out.println("client say:" +line);
if (line.equals("88")) {
break on;
}
}
}
}
- 客户端
Socket socket = null;
try {
//指定服务端
socket = new Socket("127.0.0.1",8111);
//获取输出流,向服务端套接字输出需要发送的信息。
OutputStream outputStream = socket.getOutputStream();
outputStream.write("88".getBytes());
outputStream.close();
socket.close();
}
服务端使用多线程处理客户端请求
- 线程
private Socket socket=null;
private ServerSocket ss=null;
public ServerThread(Socket socket, ServerSocket ss){
this.socket = socket;
this.ss = ss;
}
public void shutdownServerSocket(ServerSocket ss){
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
InputStream inputStream = null;
try {
inputStream = this.socket.getInputStream();
//读取客户端返回给服务端套接字中流的数据。
InputStreamReader inputStreamReader= new InputStreamReader(inputStream);
//封装成缓冲字符流,读取更方便
BufferedReader br = new BufferedReader(inputStreamReader);
String line;
while ((line = br.readLine())!=null) {
System.out.println("client say:" +line);
System.out.println(Thread.currentThread().getId() + "---" + Thread.currentThread().getName());
if (line.equals("88")) {
this.shutdownServerSocket(ss);
}
}
}
- 服务端
ServerSocket ss = null;
String line = null;
try {
//建立服务端
ss = new ServerSocket(8111);
while (true){
//监听,等待客户端连接
Socket socket = ss.accept();
ServerThread serverThread = new ServerThread(socket, ss);
serverThread.start();
}
}
客户端还是一样