网络编程
网络编程
2020/9/3 16:33:15
网络编程的常识
目前主流网络通讯软件有:微信、QQ、陌陌、探探、飞信、阿里旺旺、...
在吗?
七层网络模型
为了保证数据安全有效的传递,ISO(国际标准委员会组织)将数据的传递从逻辑上划分为以下七层:
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
当发送数据时,按照上述七层协议从前向后一层层进行加包处理再发送;
当接收数据时,按照上述七层协议从后向前一层层进行拆包处理再显示;
IP地址
如:
192.168.1.1 - 是绝大多数路由器的默认登录地址,设置账号和密码及Mac地址过滤
IP地址 - 是互联网中的唯一地址标识,根据IP地址可以定位到具体某一台设备。
IP地址本质上是由32位二进制组成的整数,叫做IPv4,当然也有128位二进制组成的整数,叫做IPv6,目前的主流还是IPv4。
日常生活中采用点分十进制表示法进行IP地址的描述,也就是将每个字节的二进制整数转换为一个十进制整数,不同的十进制整数之间采用小数点隔开。
如:
0x01020304 => 1.2.3.4
端口号
端口号 - 是设备中具体进程的标识,也就是根据端口号可以定位到具体某个进程。
网络编程提供:IP地址 + 端口号。
端口号本质上是由16位二进制组成的整体,表示范围是:0 ~ 65535,其中0 ~ 1024之间的端口号通常被系统占用,因此编程从1025开始使用。
基于tcp协议的编程模型
编程模型
服务器:
(1)创建ServerSocket类型的对象并提供端口号;
(2)等待客户端的连接请求,调用accept方法;
(3)使用输入输出流通信;
(4)关闭Socket;
package cn.itxdl.day19;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.Socket;
public class ServerThread extends Thread {
private Socket s;
public ServerThread(Socket s) {
this.s = s;
}
@Override
public void run() {
try {
// 3.使用输入输出流进行通信
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintStream ps = new PrintStream(s.getOutputStream());
while (true) {
// 接收客户端发来的字符串内容,BufferedReader类
String msg = br.readLine();
//System.out.println("服务器接收到的数据内容是:" + msg);
InetAddress ia = s.getInetAddress();
System.out.println("客户端" + ia + "发来的数据内容是:" + msg);
// 判断服务器接收到的消息是否为"bye",若是则聊天结束
if ("bye".equalsIgnoreCase(msg)) {
System.out.println("客户端" + ia + "已下线!");
break;
}
// 实现服务器向客户端回发消息
ps.println("I received!");
//System.out.println("服务器发送数据成功!");
}
// 4.关闭Socket
ps.close();
br.close();
s.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
客户端:
(1)创建Socket类型的对象并提供服务器的IP地址和端口号;
(2)使用输入输出流通信;
(3)关闭Socket;
package cn.itxdl.day19;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class ClientStringTest {
public static void main(String[] args) {
try {
// 1.创建Socket类型的对象并提供服务器的IP地址和端口号
Socket s = new Socket("XDL-20170621QCO", 8888);
System.out.println("连接服务器成功!");
// 2.使用输入输出流进行通信
Scanner sc = new Scanner(System.in);
PrintStream ps = new PrintStream(s.getOutputStream());
BufferedReader br = new BufferedReader(
new InputStreamReader(s.getInputStream()));
while(true) {
System.out.println("请输入要发送的内容:");
String str = sc.next();
// 实现客户端向服务器发送字符串内容"在吗?"
//Thread.sleep(20000);
//ps.println("在吗?");
ps.println(str);
System.out.println("客户端发送数据成功!");
// 对客户端向服务器发送的内容进行判断,若是"bye"则聊天结束
if("bye".equalsIgnoreCase(str)) {
System.out.println("聊天结束!");
break;
}
// 实现客户端接收服务器回发的消息
String msg = br.readLine();
//System.out.println("客户端接收到的数据内容是:" + msg);
}
// 3.关闭Socket
br.close();
ps.close();
sc.close();
s.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
package cn.itxdl.day19;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerStringTest {
public static void main(String[] args) {
try {
// 1.构造ServerSocket类型的对象并提供端口号
ServerSocket ss = new ServerSocket(8888);
// 2.等待客户端的连接请求,调用accept方法
while(true) {
System.out.println("等待客户端的连接请求...");
Socket s = ss.accept();
System.out.println("客户端" + s.getInetAddress()
+"连接成功!");
// 只要有客户端连接成功,就启动一个新线程为之服务
new ServerThread(s).start();
}
//ss.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}