一.网络编程概述
1.计算机网络:
把分布在不同地理区域的具有独立功能的计算机,通过通信设备与线路
连接起来,由功能完善的软件实现资源共享和信息传递的系统。
有人说,20世纪最伟大的发明不是计算机,而是计算机网络。
还有人说,如果你买了计算机而没有联网,就等于买了电话机而没有接
电话 线一样
●
Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的
支持,程序员能够很容易开发常见的网络应用程序。
●
Java提供的网络类库,可以实现网络连接,联网的底层细节被隐藏在
Java 的本机安装系统里,由 JVM 进行控制。并且 Java 实现了一个
跨平台的网络库,
程序员面对的是一个统一的网络编程环境。
•
网络编程的目的:
直接或间接地通过网络与其它计算机进行通讯。
•
网络编程中有两个主要的问题:
如何准确地定位网络上一台或多台主机
找到主机后如何可靠高效地进行数据传输
二.网络模型
三.网络通信要素:IP,端口号,通信协议
●
网络编程有三个要素分别是
:IP
地址、端口号和通信协议
.
IP
地址(
Internet Protocol Address
)是指互联网协议地址,又译为网际协议地
址
.
网络中的计算机使用
IP
地址来进行唯一标识
.
在
Windows
系统下,打开
cmd
,输入命令
ipconfig
,按回车即可查看。
本地回环地址(hostAddress):127.0.0.1 ,它代表设备的本地虚拟接口.
![](https://img-blog.csdnimg.cn/direct/662a930bd3764647a76e265c3ee0d9f1.png)
端口号是计算机中的应用程序的一个整数数字标号,用来区分不同的应用
程序。
0 ~ 1024 未被系统使用或保留的端口号,0 ~ 65535为有效的端口号,
也就是说我们要对一些程序定义端口号的时候,要选择1024 ~ 65535范
围内的整数数字。
比如,MySQL的端口号是3306,SQLServer的端口号是1433,查了一下
Oracle的端口号是1521
●
网络通信协议
计算机网络中实现通信必须有一些约定,即通信协议,对速率、传输代
码、代码结构、 传输控制步骤、出错控制等制定标准。
四.网络通信要素:网络通信协议
传输层协议中有两个非常重要的协议:
●
传输控制协议TCP(Transmission Control Protocol)
●
用户数据报协议UDP(User Datagram Protocol)。
TCP
•
使用TCP协议前,须先建立TCP连接,形成传输数据通道
•
传输前,采用“
三次握手
”方式,是可靠的
•
TCP协议进行通信的两个应用进程:客户端、服务端
•
在连接中可进行大数据量的传输
•
传输完毕,需释放已建立的连接,效率低
•
在断开时要进行
“四次挥手
![](https://img-blog.csdnimg.cn/direct/b11c2d03a1444b2988b67b8113361451.png)
![](https://img-blog.csdnimg.cn/direct/ff343f62964a4b498ee2f1ab8dbb114d.png)
UDP
•
将数据、源、目的封装成数据包,不需要建立连接
•
每个数据报的大小限制在
64K
内
•
因无需连接,故是不可靠的
•
发送数据结束时无需释放资源,速度快
五.TCP编程
●
利用套接字(Socket)开发网络应用程序早已被广泛的采用,以至于成为
事实上的标准。
●
通信的两端都要有Socket,是两台机器间通信的端点
●
网络通信其实就是Socket间的通信。
●
Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传
输。
![](https://img-blog.csdnimg.cn/direct/5771e9db7c164fff81536df1537885e8.png)
Socket常用方法:
![](https://img-blog.csdnimg.cn/direct/e76a8135d6e54bf78d6d6dedeb8d6ee1.png)
●
客户端Socket的工作过程包含以下四个基本的步骤:
●
创建 Socket:
根据指定服务端的 IP 地址或端口号构造 Socket 类对象。若服务
器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。
●
打开连接到 Socket 的输入/出流:
使用 getInputStream()方法获得输入流,
使用 getOutputStream()方法获得输出流,进行数据传输
●
按照一定的协议对 Socket 进行读/写操作:
通过输入流读取服务器放入线路的
信息(但不能读取自己放入线路的信息),通过输出流将信息写入线程。
●
关闭 Socket:
断开客户端到服务器的连接,释放线路
●
客户端程序可以使用Socket类创建对象,
创建的同时会自动向服务器方发
起连接
。Socket的构造方法是:
●
Socket(String host,int port)throws
UnknownHostException,IOException:向服务器(域名是host。端口号为
port)发起TCP连接,若成功,则创建Socket对象,否则抛出异常。
●
Socket(InetAddress address,int port)throws IOException:根据
InetAddress对象所表示的IP地址以及端口号port发起连接。
Socket s = new Socket(
“
192.168.40.165
”
,9999);
OutputStream out = s.getOutputStream();
out.write(
“
hello
”
.getBytes());
s.close()
我们这里写一个简单的服务器和用户端
服务器端:
package Interbianc;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class fuwuqi {
public static void main(String[] args) {
//创建服务器对象
try {
ServerSocket serverSocket=new ServerSocket(6689);
System.out.println("服务器启动成功");
Socket socket=serverSocket.accept();
System.out.println("有客户连接到了服务器");
String s1="nihao";
DataOutputStream dataOutputStream=new DataOutputStream(socket.getOutputStream());
dataOutputStream.writeUTF(s1);
DataInputStream dataInputStream=new DataInputStream(socket.getInputStream());
String s=dataInputStream.readUTF();
System.out.println(s);
} catch (IOException e) {
e.printStackTrace();
System.out.println("服务器启动失败,端口已被占用");
}
}
}
客户端:
package Interbianc;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class kehu {
public static void main(String[] args) {
{int a=1;
try {
Socket socket = new Socket("192.168.31.109", 6689);
String s = "leihao";
DataInputStream dataInputStream=new DataInputStream(socket.getInputStream());
String s1=dataInputStream.readUTF();
System.out.println(s1);
DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());
outputStream.writeUTF(s);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端输入服务器端的ip地址来找到服务器所在主机,然后输入程序端口号以找到服务器程序
在此之前需要先启动服务器,后启动客户端,这样便完成了一个简单服务器的搭建