网络编程是在某种协议下实现两台计算机通信的程序
1.软件结构- C/S结构:全称为Cilent/Server结构,是客户端和服务器结构。例如QQ,微信等软件。
- B/S架构:全称为Browser/Server结构,是浏览器个服务器架构。例如火狐,谷歌等浏览器。
位于同一个网络中的计算机在进行连接和通信时需要遵守的规则
3.网络通信的分类- UDP:用户数据报协议。UDP是无连接通信协议,在传输数据时发送端和接收端不建立逻辑连接,即发送端发送信息时不用判断接收端是否存在,接收端接收信息时不用反馈给发送端是否受到。
UDP协议消耗资源小,效率高通常用于视频音频的传输。UDP协议传输数据时容易丢包,因此在传输重要数据时不使用UDP协议。(数据被限制在64kb以内,超过此范围就不能发送) - TCP协议:传输控制协议。TCP协议是面向连接的通信协议,在发送数据前,发送端和接收端需建立逻辑连接才能传输数据。在TCP协议中必须要明确客户端和服务器端并且由客户端向服务器端发出连接请求,每次连接都要经过“三次握手”
第一次握手:客户端向服务器端发出连接请求,等待服务器确认。
第二次握手:服务器端向客户端返回一个响应。
第三次握手:客户端向服务端发送确认信息,确定连接。 - 两者区别:UDP效率高但不安全,TCP安全,效率不如UDP。
- UDP、TCP
- 互联网协议地址,成为IP地址。IP地址是网络中计算机的唯一的编号。
- IPV4:是一个32位的二进制数,被分为四个字节,写成a.b.c.d的形式(abcd为十进制整数),每一位的范围都在0~255之间。例如:192.168.20.1
- IPV6:采用128位地址长度,每16位一组,分成8组十六进制数,表示成
- 特殊的IP地址:127.0.0.1和localhost,代表本机IP
TCP通信能实现两台计算机之间的数据交互,通信的两端要严格的区分客户端和服务端。
通信步骤:要先启动服务端,等待客户端的连接。
客户端主动连接服务器端,连接成功可进行通信。注意,服务器端不可主动连接客户端。
Socket类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点,包含了ip地址和端口号的网络单位。
构造方法- public Socket(String host,int port):创建套接字对象并将其连接到指定主机上的指定端口号,如果指定的host为null,那么相当于指定地址为回送地址。
host:可以是服务器主机的ip地址,也可以是服务器主机的名称。
port:服务器的端口号。
Socket socket=new Socket("127.0.0.1",8888);
成员方法
- getOutputStream();返回套接字的输出流;
- getInputStream();返回此套接字的输入流;
- close();关闭套接字;
- 创建客户端对象Socket,构造方法绑定服务器的ip地址和端口号。
- 使用getOutputStream()方法获取网络字节输出流OutputStream对象。
- 使用OutputStream对象中的方法write,给服务器发送数据。
- 使用getInputStream()获取网络字节输入流InputStream对象,使用其read方法读取数据
- 调用close关闭socket对象。
注意:服务器与客户端交互,必须使用Socket中提供的网络流,不能是自己创建的流对象。
当客户端创建Socket对象时,就会请求服务器进行三次握手获得连接,如果此时服务器未启动,那么将会抛出异常。
代码如下:
客户端:
public class TCPClient {
public static void main(String[] args) {
try {
Socket s=new Socket("127.0.0.1",8888);//绑定服务器ip地址和端口号
OutputStream ops= s.getOutputStream();//获取字节输出流对象
ops.write("hello".getBytes());//向服务器发送数据
InputStream is=s.getInputStream();//获取字节输入流对象
byte[] bytes=new byte[1024];
int temp=is.read(bytes);//读取服务器响应的数据
System.out.println(new String(bytes,0,temp));
s.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
注意:当我们运行此程序时,会抛出异常,因为服务器未启动
服务器端:
public class TCPServer {
public static void main(String[] args) {
try {
ServerSocket ss=new ServerSocket(8888);//创建服务器SocketServer对象和向系统要指定的端口号
Socket s=ss.accept();
InputStream is=s.getInputStream();
byte[] bytes=new byte[1024];
int temp=is.read(bytes);
System.out.println(new String(bytes,0,temp));
OutputStream os=s.getOutputStream();
os.write("I get it!".getBytes());
s.close();
ss.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
UDP通信
UDP是面向无连接通信,数据可能缺失,实现UDP通信主要用到两个类:DatagramPacket;
DatagramSocket
DatagramSocket类用来表示接收和发送数据包的套接字;
DatagramSocket socket = new DatagramSocket(0);//构造方法创造数据报套接字并将其绑定到指定端口上
DatagramPacket类表示数据报包,用来实现无连接的包的投递服务;
接收端:
- 调用DatagramSocket(int port)创建一个数据报套接字,绑定在指定端口上;
- 调用DatagramPacket(byte[] buf,int length),建立一个字节数组来接收UDP包;
- 调用DatagramSocket.receive();
- 最后关闭数据报套接字。
public class UDPrecive {
public static void main(String[] args) throws IOException {
// 1.创建服务器端DatagramSocket,指定端口
DatagramSocket socket = new DatagramSocket(8800);
// 2.创建数据报,用于接收客户端发送的数据
byte[] data = new byte[1024];// 创建字节数组,指定接收的数据包的大小
DatagramPacket packet = new DatagramPacket(data, data.length);
// 3.接收客户端发送的数据
System.out.println("****服务器端已经启动,等待客户端发送数据");
socket.receive(packet);// 此方法在接收到数据报之前会一直阻塞
// 4.读取数据
String info = new String(data, 0, packet.getLength());
System.out.println("我是服务器,客户端说:" + info);
// 1.定义客户端的地址、端口号、数据
InetAddress address = packet.getAddress();
int port = packet.getPort();
byte[] data2 = "欢迎您!".getBytes();
// 2.创建数据报,包含响应的数据信息
DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address, port);
// 3.响应客户端
socket.send(packet2);
// 4.关闭资源
socket.close();
}
}
发送端:
- 调用DatagramSocket()创建一个数据报套接字;
- 调用DatagramPacket(byte[] buf,int offset,InetAddress address,int port),建立要发送的UDP包
- 调用DatagramSocket类的send方法发送数据包;
- 关闭数据报套接字。
public class UDPsend {
public static void main(String[] args) throws IOException {
// 1.定义服务器的地址、端口号、数据
InetAddress address = InetAddress.getByName("localhost");
int port = 8800;
byte[] data = "用户名:admin;密码:123".getBytes();
// 2.创建数据报,包含发送的数据信息
DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
// 3.创建DatagramSocket对象
DatagramSocket socket = new DatagramSocket();
// 4.向服务器端发送数据报
socket.send(packet);
// 1.创建数据报,用于接收服务器端响应的数据
byte[] data2 = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(data2, data2.length);
// 2.接收服务器响应的数据
socket.receive(packet2);
// 3.读取数据
String reply = new String(data2, 0, packet2.getLength());
System.out.println("我是客户端,服务器说:" + reply);
// 4.关闭资源
socket.close();
}
}
URL
常用方法1.URL(Uniform Resource Locator):统一资源定位符,它表示Internet上某一资源的地址
2.URL的基本结构由5部分组成:
<传输协议>://<主机名>:<端口号>/<文件名>#片段名?参数列表
例如:
http://192.168.2.100:8080/helloworld/index.jsp#a?username=shkstart&password=123
- 获取该URL的协议名
public String getProtocol() - 获取该URL的主机名
public String getHost() - 获取该URL的端口号
public String getPort() - 获取该URL的文件路径
public String getPath() - 获取该URL的文件名
public String getFile() - 获取该URL的查询名
public String getQuery()
代码使用:
下载URL资源
HttpURLConnection urlConnection = null;
InputStream is = null;
FileOutputStream fos = null;
try {
URL url = new URL("http://localhost:8080/pic/dog.jpeg");
urlConnection = (HttpURLConnection)url.openConnection();
urlConnection.connect();
is = urlConnection.getInputStream();
fos = new FileOutputStream("dog.jpeg");
byte[] buffer = new byte[1024];
int len;
while((len = is.read())!=-1){
fos.write(buffer,0,len);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if(fos!=null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(urlConnection!=null){
urlConnection.disconnect();
}
}



