一.网络:java网络编程
网络中的基本概念
计算机
网络
ip地址:每一台计算机在网络中拥有唯一的网络地址
32位的二进制 8位一部分 0-255
192.168.1.1
确保连接在同一网络下,连接同一个热点,可以通过ping命令测试是否能够连接到另外一台计算机
端口号
当前计算机通过防火墙对外暴露的服务
URI:统一资源标识符
URL:统一资源定位符 映射的路径
通过一串字符串定位到一个具体的资源(文件,视频,音频…)
协议
数据传输所制定的规则
ISO,OSI七层协议
物理层–>应用层
传输层协议:
TCP:可靠的安全的高成本的
三次握手
想打电话一样,确保服务器能够接收到数据
UDP:不可靠的不安全的低成本的
负责发送一个数据包
像写信一样
当前软件的架构
B/S:浏览器服务器 Broswer/Server
不需要下载客户端
服务器的资源压力要大
C/S:客户端服务器 Client/Server
需要下载客户端
客户端会时刻要求更新
客户端可以分担一部分服务器的资源压力
客户端和服务器
服务器
任何一台提供资源分享的计算机都可以被称为服务器
客户端
在网络中寻求资源的一台计算机
网络传递过程,客户端和服务器互相发生送数据的过程
比如客户端对服务器说:我想要一张图片–>请求
服务器会发回一张图片给客户端–>响应
一次会话
Java中如何实现网络编程
Socket 套接字,可以看成是一个管道
实际上客户端和服务器之间传递的就是Socket对象
使用java代码实现TCP协议传输
1.一个客户端的程序和一个服务器端的程序
2.服务器新建一个ServerSocket对象,构造器提供要开放的端口port
3.服务器要启动并监听访问的客户端
ss.accept();
4.客户端新建一个Socket对象,构造器提供IP地址和端口号
5.使用同一个Socket来作为媒介,使用它的输入流和输出流传递数据
6.如果服务器端要使用多线程处理客户端传过来的socket,需要用一个线程来处理socket,对监听的方法进行死循环包装,每当接收到一个socket的时候,就开起一条线程来处理逻辑
相关代码实现:
建立一个TCP客户端程序和TCP服务器程序
import java.io.*;
import java.net.Socket;
/**
* TCP客户端程序
*
* @author Acer
*
*/
public class TCPClient {
public static void main(String[] args) {
// 1.准备Socket对象
// 如果访问本地的主机
// ip地址:127.0.0.1或者localhost(127.0.0.1是字迹访问自己)
try {
Socket socket = new Socket("127.0.0.1", 2333);
System.out.println(socket);
System.out.println("连接成功,正在发送数据...");
// 想要传递数据
OutputStream os = socket.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
bw.write("我想要一个当前的时间");
bw.flush();
//解决方式
socket.shutdownOutput();//关闭客户端socket的输出流,方便下一次接收
//客户端需要接受
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String s = "";
while((s=br.readLine())!=null) {
System.out.println("服务器的反馈"+s);
}
br.close();
bw.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
/**
* TCP服务器端程序
*
* @author Acer
*
*/
public class TCPServer {
public static void main(String[] args) {
// 1.在服务器端使用的是ServerSocket
// 提供一个端口号,端口号取值范围0-65535
// 0-1023 系统服务
// 1024-45000左右 自定义的端口(可用)
// 45000-最后 随机端口
try {
ServerSocket ss = new ServerSocket(2333);
//需要开启服务器来监听客户端的访问
System.out.println("服务器开始监听...");
//如果需要多线程,则监听的代码需要在死循环里
Socket socket = ss.accept();
System.out.println(socket);
System.out.println("连接成功,服务器开始接收数据...");
//使用输入流来读取Socket里面的信息
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String data = "";
while((data = br.readLine())!=null) {
System.out.println("本次收到的数据为"+data);
}
//向客户端发送一个响应
PrintWriter pw = new PrintWriter(socket.getOutputStream());
pw.println("当前的时间"+new Date());
//后开的先关
pw.flush();
pw.close();
br.close();
socket.close();
ss.accept();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
使用java代码实现UDP协议传输
1.一个客户端程序和服务器端程序
2.服务器端需要DatagramSocket
相关代码实现:
建立UDP协议的客户端和服务器
/**
* UDP协议的客户端
*/
import java.net.*;
public class UDPClient {
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket();
// 包装数据用的数据包
byte[] buff = new byte[1024];// 数据包的声明
buff = "马上改吃饭了".getBytes();// 数据包的添加
// 高速数据包的地址
InetAddress ia = InetAddress.getByName("127.0.0.1");
DatagramPacket dp = new DatagramPacket(buff, buff.length, ia, 2333);
// 发送数据包
ds.send(dp);
}
}
import java.net.*;
/**
* UDP协议的服务器
* @author Acer
*
*/
public class UDPServer {
public static void main(String[] args) throws Exception {
System.out.println("UDP服务器开启...");
DatagramSocket ds = new DatagramSocket(2333);
byte[] buff = new byte[1024];
DatagramPacket dp = new DatagramPacket(buff, buff.length);
ds.receive(dp);
buff = dp.getData();
System.out.println(new String(buff));
}
}