网络编程
网络编程
Socket
也叫套接字编程,是一个抽象层。应用程序可以通过它发送或接收数据,可对其像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口与协议的组合。
- Socket就是为网络编程提供的一种机制 (通信的两端都有Socket)
- 网络通信其实就是Socket间的通信 (数据在两个Socket间通过IO传输)
图解:
ServerSocket类 (服务端)
ServerSocket
在服务器端,选择一个端口号,在指定端口上等待客户端发起连接。
启动服务:ServerSocket ss = new ServerSocket(端口);
等待客户端发起连接,并建立连接通道:Sokcet socket = ss.accept();
Socket类 (客户端)
Socket
新建Socket对象,连接指定ip的服务器的指定端口
Socket s = new Socket(ip, port);
从Socket获取双向的流. 这里可联合IO流一起使用
InputStream in = s.getInputStream(); // 获取读取流 (接收流)
OutputStream out = s.getOutputStream(); // 获取写出流 (发送流)
简单案例
案例介绍:
客户端发送hello
, 服务器响应world
Server类
// 这个类用来测试 网络通信服务器端
// 服务器: 负责接收客户端发来的请求 并作出回应
public class Server {
public static void main(String[] args) throws IOException {
// 启动服务器 -- 是指在8000端口号的位置, 等待客户端连接
// 端口号包含: 0 ~ 65535, 其中 0 ~ 1024 已被系统占用
ServerSocket server = new ServerSocket(8000);
System.out.println("服务器已启动, 等待客户端连接");
// 接口客户端发来的请求 -- 并建立数据连接通道
Socket socket = server.accept(); // 进入阻塞状态, 等待客户端连接
System.out.println("与客户端连接成功");
// 从客户端获取内容
InputStream in = socket.getInputStream();
for (int i = 0; i < 5; i++) {
char b = (char) in.read();
System.out.print(b);
}
// 返回给客户端的内容
OutputStream out = socket.getOutputStream();
out.write("world".getBytes()); // 回复给客户端的内容
out.flush();
in.close();
out.close();
socket.close();
}
}
Client类
// 这个类用来测试客户端
// 客户端: 负责接收服务器发回来的数据, 并给服务器发送数据
public class Client {
public static void main(String[] args) throws IOException {
// 尝试连接服务器 -- 同时制定服务器的ip和端口号
Socket socket = new Socket("localhost", 8000);
// 给服务器发送数据, 发送是out, 就是输出流
OutputStream out = socket.getOutputStream();
// 写出hello
out.write("hello".getBytes()); // 发送大到服务器的内容
out.flush(); // 刷出去, 没有这一句的话服务器无法收到
// 从服务器获取内容
InputStream in = socket.getInputStream();
for (int i = 0; i < 5; i++) {
int b = in.read();
System.out.print((char) b);
}
}
}
如果需要按行读取, in
和 out
可以这样进行定义 (无设置编码格式)
BufferedReader in = new BufferedReader( // 按行读取
new InputStreamReader( // 转换流
socket.getInputStream() // 从获取读取流
)
);
PrintWriter out = new PrintWriter( // 按行发送
new OutputStreamWriter( // 转换流
socket.getOutputStream() // 获取写出流
)
);