网络编程(理解)
-
用编程语言来实现计算机的资源共享和信息传递。
- 计算机网络:多台独立的计算机用网络通信设备连接起来的网络。
- 实现资源共享和数据传递。
- 计算机网络:多台独立的计算机用网络通信设备连接起来的网络。
网络通信的三要素
* IP地址
* 计算机在网络中的唯一标识。
* 现在使用的是:"点分十进制"
* 端口
* 应用程序的的标记。
* 协议
* 通信的规则。
* UDP:不建立连接,数据打包传输,数据有限制,数据不可靠,速度快。
* TCP:建立连接,数据无限制,数据可靠,速度慢。
-
网络7层协议图解
-
Socket通信概述图解
-
UDP发送和接收数据图解
- UDP发送和接收数据
1. 先开启谁都无所谓。
2. 发送端
创建发送端的Socket服务对象。
创建数据并把数据打包。
发送数据。
释放资源。
3. 接收端
创建接收端的Socket服务对象。
创建数据包。
接收数据。
解析数据。
释放资源。
案例一:UDP协议 键盘录入数据服务器接收并显示数据。
//SendDemo发送demo
public class SendDemo {
public static void main(String[] args) throws IOException {
//创建Socket对象
DatagramSocket socket = new DatagramSocket();
// public DatagramPacket(byte[] buf,int length,InetAddress address,int
// port)
// buf其实就是要发送的数据信息
// length表示要发送的数据长度
// address数据要发到哪里去。对应的那个IP地址对象
// port端口号
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String string = null;
while ((string = reader.readLine()) != null ) {
if ("886".equals(string)) {
break;
}
byte[] by = string.getBytes();
DatagramPacket p = new DatagramPacket(by, by.length, InetAddress.getByName("192.168.3.108"), 10086);
socket.send(p);
}
socket.close();
}
}
ReceiveDemo接收demo
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
//创建接收对象 并指定端口
DatagramSocket socket = new DatagramSocket(10086);
while (true) {
//创建接收数据包 接收数据
byte[] by = new byte[1024];
DatagramPacket p = new DatagramPacket(by, by.length);
//接收数据
socket.receive(p);
//解析数据并显示
//InetAddress address = p.getAddress();
//String ip = address.getHostAddress();
byte[] byt = p.getData();
String string = new String(byt, 0,p.getLength());
System.out.println("获得的数据是:" + string);
}
//关闭释放资源
//socket.close();
}
}
-
UDP通讯简单使用多线程优化
- 直接看代码
ChatRoom测试类
public class ChatRoom {
public static void main(String[] args) throws IOException {
DatagramSocket dsSend = new DatagramSocket();
DatagramSocket dsReceive = new DatagramSocket(11111);
SendThread st = new SendThread(dsSend);
ReceiveThread rt = new ReceiveThread(dsReceive);
Thread t1 = new Thread(st);
Thread t2 = new Thread(rt);
t1.start();
t2.start();
}
}
接收数据类ReceiveThread
public class ReceiveThread implements Runnable {
private DatagramSocket ds;
public ReceiveThread(DatagramSocket ds) {
this.ds = ds;
}
@Override
public void run() {
try {
while (true) {
// 创建数据包
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
// 接收数据
ds.receive(dp);
// 解析数据
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(), 0, dp.getLength());
System.out.println("from " + ip + " data is " + data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
发送数据类SendThread
public class SendThread implements Runnable {
private DatagramSocket ds;
public SendThread(DatagramSocket ds) {
this.ds = ds;
}
@Override
public void run() {
try {
// 封装键盘录入
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
String line = null;
while ((line = br.readLine()) != null) {
if ("886".equals(line)) {
break;
}
// 创建数据包
byte[] bys = line.getBytes();
DatagramPacket dp = new DatagramPacket(bys, bys.length,
InetAddress.getByName("192.168.3.108"), 11111);
// 发送数据
ds.send(dp);
}
// 释放资源
ds.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
TCP发送和接收数据
必须先开启服务器。
A:客户端
创建客户端Socket对象。
获取输出流。
写数据。
释放资源。
B:服务器端
创建服务器Socket对象。
监听客户端连接。
获取输入流。
读取数据。
释放资源。
-
TCP协议发送和接收数据图解
案例一:TCP协议 客户端(ClientDemo)是键盘录入,服务器(ServerDemo)是写到文件。
ClientDemo 模拟客户端
public class ClientDemo {
public static void main(String[] args) throws IOException {
// 创建客户端对象
Socket s = new Socket("192.168.32.80", 12345);
// 键盘录入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 把通道内的输出流包装
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream()));
String line = null;
while ((line = br.readLine()) != null) {
if ("over".equals(line)) {
break;
}
bw.write(line);
bw.newLine();
bw.flush();
}
s.close();
}
}
ServerDemo 模拟服务器
public class ServerDemo {
public static void main(String[] args) throws IOException {
// 创建服务器Socket对象
ServerSocket ss = new ServerSocket(12345);
// 监听客户端连接
Socket s = ss.accept();
// 封装通道内的输入流
BufferedReader br = new BufferedReader(new InputStreamReader(
s.getInputStream()));
// 把数据写到文件
BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
bw.close();
s.close();
ss.close();
}
}
案例二:TCP协议 客户端是读取文件,服务器是写到文件。反馈信息
ClientDemo 模拟客户端
public class ClientDemo {
public static void main(String[] args) throws IOException {
// 创建客户端对象
Socket s = new Socket("192.168.32.80", 12345);
// 读取文件的数据
BufferedReader br = new BufferedReader(new FileReader(
"InetAddressDemo.java"));
// 把通道内的输出流包装
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream()));
String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
// bw.write("你可以释放了");
// bw.newLine();
// bw.flush();
s.shutdownOutput(); // 禁用输出流
// 获取服务器的反馈
// 把通道内的输入流包装
BufferedReader reader = new BufferedReader(new InputStreamReader(
s.getInputStream()));
String data = reader.readLine(); // 阻塞式
System.out.println("client:" + data);
// 释放资源
br.close();
s.close();
}
}
ServerDemo 模拟服务器
public class ServerDemo {
public static void main(String[] args) throws IOException {
// 创建服务器对象
ServerSocket ss = new ServerSocket(12345);
// 监听客户端连接
Socket s = ss.accept();
// 把通道内的输入流包装
BufferedReader br = new BufferedReader(new InputStreamReader(
s.getInputStream()));
// 把数据写入文件
BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));
String line = null;
while ((line = br.readLine()) != null) { // 阻塞式
// if("你可以释放了".equals(line)){
// break;
// }
bw.write(line);
bw.newLine();
bw.flush();
}
// 给客户端一个反馈
// 把通道内的输出流包装
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream()));
writer.write("文件上传成功");
writer.newLine();
writer.flush();
// 释放资源
bw.close();
s.close();
ss.close();
}
}
案例三:TCP协议 客户端是读取图片,服务器是写到图片。反馈信息
ClientDemo 模拟客户端
public class ClientDemo {
public static void main(String[] args) throws IOException {
// 窗口客户端对象
Socket s = new Socket("192.168.32.80", 12345);
// 读取图片
InputStream is = new FileInputStream("mn.jpg");
// 写到通道
OutputStream os = s.getOutputStream();
int by = 0;
while ((by = is.read()) != -1) {
os.write(by);
}
s.shutdownOutput();
// 获取服务器的反馈
// 把通道内的输入流包装
BufferedReader reader = new BufferedReader(new InputStreamReader(
s.getInputStream()));
String data = reader.readLine(); // 阻塞式
System.out.println("client:" + data);
// 释放资源
is.close();
s.close();
}
}
ServerDemo 模拟服务器
public class ServerDemo {
public static void main(String[] args) throws IOException {
// 创建服务器对象
ServerSocket ss = new ServerSocket(12345);
// 监听客户端连接
Socket s = ss.accept();
// 获取输入流
InputStream is = s.getInputStream();
// 获取输出流
OutputStream os = new FileOutputStream("copy.jpg");
int by = 0;
while ((by = is.read()) != -1) {
os.write(by);
}
// 给出反馈
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream()));
writer.write("文件上传成功");
writer.newLine();
writer.flush();
os.close();
s.close();
ss.close();
}
}