网络编程
网络概念
能够向另一台计算机发送或接收数据的程序叫网络程序
IP
IP地址具有唯一性,IP地址是IP网络中数据传输的依据,它标识了IP网络中的一个连接,一台主机可以有多个IP地址。IP分组中的IP地址在网络传输中是保持不变的
端口号
保证软件与外界的通信互不干扰,一般来说一个端口只能同时被一个软件使用
协议
为网络中的数据交换(通信)建立的规则、标准或约定
socket
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket
HTTP协议
客户端浏览器或其他程序与Web服务器之间的应用层通信协议
Web服务器
网络服务器是网络环境下为客户提供某种服务的专用计算机
TCP:面向连接的可靠的传输协议
import java.io.*;
import java.net.*;
import java.util.Scanner;
/*
* 服务器
* ServerSocket:实现端口侦听
*/
public class Server {
public static void main(String[] args) throws Exception {
Scanner input = new Scanner(System.in);
System.out.println("======服务器======");
// 1.创建服务器端的ServerSocket对象
ServerSocket serverSocket = new ServerSocket(8806);
System.out.println("正在等待连接....");
// 2.侦听端口,阻塞当前程序;连接建立成功返回Socket类的实例
Socket socket = serverSocket.accept();
System.out.println("连接成功....");
// 3.获取输入流,接收读入信息
InputStream is = socket.getInputStream();
byte[] buffer = new byte[1024];
is.read(buffer);
// 4.关闭
socket.shutdownInput();
System.out.println("He said:"+new String(buffer));
// 获取输出流
OutputStream os = socket.getOutputStream();
System.out.println("you said:");
String msg = input.next();
// 写出信息
os.write(msg.getBytes());
os.flush();
socket.shutdownOutput();
/*
* 使用字节流进行输入,可能会导致中文乱码和效率低下,所以可以使用
* InputStreamReader将其转换为字符流,在使用BufferedReader增加缓存功能
*/
}
}
import java.io.*;
import java.net.*;
import java.util.Scanner;
/*
* 使用TCP/IP协议开发的程序,一般分客户端和服务器两部分;
* 客户端
*/
public class Client {
public static void main(String[] args) throws Exception {
System.out.println("======客户端======");
Scanner input = new Scanner(System.in);
// 创建客户端Socket对象,指定IP和端口
Socket socket = new Socket("127.0.0.1", 8806);
// 获取输出流,写入信息
OutputStream os = socket.getOutputStream();
System.out.println("you said:");
String msg = input.next();
os.write(msg.getBytes());
socket.shutdownOutput();
// 获取输入流,读入信息
InputStream is = socket.getInputStream();
byte[] buffer = new byte[1024];
is.read(buffer);
socket.shutdownInput();
System.out.println("He said:"+new String(buffer));
}
}
UDP:是无连接的、不可靠的协议
import java.net.*;
import java.util.Scanner;
public class Client1 {
public static void main(String[] args) throws Exception {
// 信息
Scanner input = new Scanner(System.in);
System.out.println("you said:");
String msg = input.next();
// 创建数据码头
DatagramSocket socket = new DatagramSocket();
// 创建数据包
/*
* 包装发送的数据,第一个参数为数据转换为字节数组,第二个参数为发送长度,第三个参数为接收方地址,第四个参数为端口号
*/
DatagramPacket packet = new DatagramPacket(msg.getBytes(),
msg.getBytes().length, InetAddress.getByName("127.0.0.1"), 8812);
// 发送
socket.send(packet);
socket.close();
}
}
import java.net.*;
public class Client2 {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(8812);
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
byte[] data = packet.getData();
System.out.println("He said:"+new String(data));
socket.close();
}
}