目录
一、网络编程
1.案例:服务器与客户端
@Test
public void serve(){
try {
// 创建了一个服务器对象,绑定在8888端口
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务器已启动...");
// 服务器在等待客户端连接
Socket accept = serverSocket.accept();//连接
// 读取客户端发送过来的信息
InputStream inputStream = accept.getInputStream();
byte[] bytes = new byte[1024*1024];
int len;
while ((len = inputStream.read(bytes))!=-1){
System.out.println("服务器已接收客户端的数据:"+new String(bytes,0,len));
}
// 释放资源
inputStream.close();
accept.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void client(){
// 创建了一个Socket通信的客户端
Socket socket = new Socket();
try {
//客户端连接服务器
// 第一个参数就是获取当前电脑的IP地址
// 第二个参数就是服务器的端口号
socket.connect(new InetSocketAddress(InetAddress.getLoopbackAddress(),8888));
// 客户端发送数据给服务器
OutputStream outputStream = socket.getOutputStream();
String hell = "hell";
outputStream.write(hell.getBytes());
System.out.println("客户端已发送数据:"+hell);
// 释放资源
socket.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
2.UDP:不可靠的传输协议
面试题:TCP/IP协议和UDP的区别?
@Test
public void client() throws IOException {
DatagramSocket socket = new DatagramSocket();
String str = "我通过UDP协议发送的消息...";
byte [] data = str.getBytes();
// 构建成了一个数据报文
// 第一个参数就是要发送的数据
// 第二个参数从哪开始发
// 第三个参数发多长
// 第四个参数指定服务器的ip地址
// 第五个参数是服务器的端口号
DatagramPacket packet = new DatagramPacket(data,
0,data.length,
InetAddress.getLocalHost(),9999);
// 发送数据
socket.send(packet);
System.out.println("数据发送成功...");
socket.close();
}
@Test
public void server() throws IOException {
// 服务器指定端口号
DatagramSocket socket = new DatagramSocket(9999);
byte [] buffer = new byte[1024 * 1024];
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
// 接收客户端发过来的数据
socket.receive(packet);
System.out.println(new String(packet.getData(),0,packet.getLength()));
socket.close();
}
3.URL
URL:https://www.163.com/,对应着互联网的一个资源网址
URL:https://192.168.1.1:8888/goods
协议 主机名 端口号 资源地址
public static void main(String[] args) { try { URL url = new URL("https://192.168.1.1:8888/demo/list.html?usenrame=123&password=123456"); System.out.println(url.getProtocol()); System.out.println(url.getHost()); System.out.println(url.getPort()); System.out.println(url.getPath()); System.out.println(url.getFile()); System.out.println(url.getQuery()); } catch (MalformedURLException e) { throw new RuntimeException(e); } }
public static void main(String[] args) { try { InetAddress inet1 = InetAddress.getByName("192.168.1.1"); System.out.println(inet1); InetAddress inet2 = InetAddress.getByName("www.baidu.com"); System.out.println(inet2); // 获取本地ip InetAddress localHost = InetAddress.getLocalHost(); System.out.println(localHost); // 获取本机的主机名 System.out.println(localHost.getHostName()); System.out.println(localHost.getHostAddress()); } catch (UnknownHostException e) { throw new RuntimeException(e); } }
4.框架
- C/S架构:Client/Server客户端/服务器,QQ,360,腾讯会议,游戏
- B/S架构:Browser/Server浏览器/服务器,
- 移动互联,手机端为主,C/S架构
Java主要要做的就是架构中的Server端。
1.静态资源:所有用户访问后,得到的结果都是一样的。html
2.动态资源:每个用户访问后,得到的结果可能不一样。爱奇艺,
web服务器:接收用户的请求,处理请求,给出响应。
通过浏览器访问我们的ServerSocket服务器,我们通过浏览器给我们的ServerSocket服务器发起了请求:我要访问服务器!!!
通过IP地址 + 端口号
本机的IP地址:
1.cmd---ipconfig
2.127.0.0.1---本机(个人建议,任何情况都好使)
3.localhost---本机(前提条件:你的电脑要联网,激活一下网卡)
- 127.0.0.1:8080
- 我们通过浏览器访问我们的ServerSocket,得到了一堆信息,看不懂。
- 其实发送过来的信息,报文。浏览器传递过来的一些消息。
- User-Agent:告诉服务器我是从什么样的客户端来的。
- Host: 127.0.0.1:8080,主机地址,目标主机。
- 貌似浏览器也是通过Socket和我们的服务器建立了TCP连接
- 我们不妨把浏览器给我们的服务器发送的信息称之为“请求”,
- 而且这个请求格式满足了http的协议。
- 请求:客户端--->服务器
- 响应:服务器--->客户端
- 我需要给浏览器一个响应!!!
我们一般情况下,给浏览器做出响应,需要遵循浏览器的格式要求:
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8080);
// 等待客户端的连接
Socket accept = serverSocket.accept();
// 获取一个输入流来读取客户端发送的数据
InputStream inputStream = accept.getInputStream();
byte [] buf = new byte[1024];
int len;
while((len = inputStream.read(buf)) != -1){
System.out.println(new String(buf,0,len));
}
inputStream.close();
accept.close();
}
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务器启动成功...");
Socket server = serverSocket.accept();
OutputStream outputStream = server.getOutputStream();
// 按照http协议的格式封装一个报文数据
String response = "HTTP/1.1 200 OK\r\n"+
"Content-Length: 39\r\n" +
"Content-Type: text/html;charset=UTF-8\r\n\r\n" +
"<h1>hello server</h1>";
outputStream.write(response.getBytes());
outputStream.flush();
// 这个流不要着急关,因为突然的关闭会导致浏览器和服务器断开连接
}
重定向:
假如我要访问的是www.baidu.com,结果页面展示的是www.jd.com
重定向会重新定位到新的页面,而且地址栏的地址也会随之变化。
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务器启动成功...");
Socket server = serverSocket.accept();
OutputStream outputStream = server.getOutputStream();
// 按照http协议的格式封装一个报文数据
String response = "HTTP/1.1 302 Moved Temporarily\r\n"+
"Location: https://www.baidu.com\r\n\r\n";
outputStream.write(response.getBytes());
outputStream.flush();
// 这个流不要着急关,因为突然的关闭会导致浏览器和服务器断开连接
}