5.网络编程

IP地址(Internet  Protocol)

唯一标识网络上的每一台计算机

IP地址的组成

32位,由4个8位二进制数组成

IP地址 = 网络地址 +主机地址

网络地址:标识计算机或网络设备所在的网段

主机地址:标识特定主机或网络设备

 

查看IP地址,检测网络是否畅通

查看本机的IP地址

ipconfig

测试网络是否通畅

ping  目标IP地址

网络服务器

通常指在网络环境下,具有较高计算能力,能够提供用户服务功能的计算机

 

网络通信协议

为了在网络中不同的计算机之间进行通信而建立的规则、标准或约定的集合

物理层/数据链路层 由底层网络定义的协议

网络层 ICMP,IGMP,IP,ARP,RARP

传输层 TCP.UDP

应用层 HTTP,FTP,TFTP,SMTP,SNMP,DNS

TCP协议(Transmission Control Protocol 传输控制协议

面向连接的、可靠的、基于字节流的传输通信协议。

UDP协议(User Datagram Protocol 用户数据报协议)

无连接的协议,在传输数据之前,客户端和服务器并不建立和维护连接

什么是Socket

通信链路的端点就被称为“套接字”(英文名Socket)

Socket的底层机制复杂,Java平台提供了一些简单的API,可以更简单有效的

 

  1. 某公司使用一台路由器,将公司的50台电脑连接在一起,构成是(局域网);

网络中有一台主机,IP地址是210.10.8.1,他的网络ID是(210.10.8.这是C类网,网络ID是前三个数字。

 

使用Socket开发而无需了解底层机制

java.net包

Socket

ServerSocket  服务器

DatagramPacket

DatagramSocket

InetAddress

……

基于TCP协议的Socket网络通信

用来实现双向安全连接网络通信

Socket通信模型

进行网络通信时,Socket需要借助数据流来完成数据的传递工作

Socket网络编程一般可以分成如下步骤进行

    建立连接

    打开Socket关联的输入输出流socket inputStream ouputStream

    流中读写信息read()  write()

    关闭所有的数据流和Socket

 

如何传递对象信息呢?

ObjectOutputStream  oos = new  ObjectOutputStream(…);

oos.writeObject(…);
ObjectInputStream  ois = new  ObjectInputStream(…);

Object = ois.readObject();

如何实现多客户请求呢?

采用多线程的方式

一个专门负责监听的应用主服务程序

一个专门负责处理请求的线程程序

 

TCP UDP

是否连接 面向连接 面向非连接

传输可靠性 可靠 不可靠

速度 慢 快

 

 

DatagramPacket类

封装了数据报的数据、数据长度、目标地址和目标端口

 

DatagramSocket类

接收和发送DatagramPacket对象封装好的数据报

 

基于UDP协议的Socket网络编程步骤

利用 DatagramPacket 对象封装数据报

利用 DatagramSocket 发送数据报

利用 DatagramSocket 接收数据报

利用 DatagramPacket 处理数据报

判断对错

DatagramPacket类提供用于发送或接收数据的方法

基于UDP协议的通信与基于TCP协议的通信相比,不如后者可靠  

Socket分类

  1. 流式套接字:面向连接、可靠的数据传输服务
  2. 数据报式套接字:无连接服务
  3. 原始式套接字

 

Socket---LoginClient:  客户端!

/*

客户端

发送请求到服务器

创建一个客户端的Socket

先半关闭输出流

通过输入流接收服务器给我的响应

释放资源

*/

public class LoginClient {

public static void main(String[] args) {

Scanner input = new Scanner(System.in);

try {

// 创建一个客户端的Socket

Socket socket = new Socket("localhost", 5000);

System.out.println("客户端已启动");
// 通过输出流发送请求

System.out.println("输入:");

String str = input.next();

OutputStream os = socket.getOutputStream();

byte[] bytes = str.getBytes();

os.write(bytes);// 向服务器发送消息

socket.shutdownOutput();
// 通过输入流接收服务器给我的响应

InputStream is = socket.getInputStream();

BufferedReader br = new BufferedReader(new InputStreamReader(is));

String reply;

while ((reply = br.readLine()) != null) {

System.out.println("服务器说:" + reply);

}
// 释放资源

os.close();

socket.close();

} catch (UnknownHostException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}

 

 

Socket---LoginServer  服务器!

//服务器

/*

  //接收客户端请求

1、创建一个服务器Socket

2、使用accept()侦听,并接收到ServerSocket的连接---获得用户的请求, 此时是在堵塞等待

3、获得输入流,获得用户的请求

4、封装字符流,变成一个缓冲流

//给客户端一个相应

//通过输出流将响应发回给客户端

5、释放相应资源*/

public class LoginServer {

public static void main(String[] args) {

try {

System.out.println("启动服务器");

// 创建一个 Socket

ServerSocket serverSocket = new ServerSocket(5000);

// 使用accept()倾听并收到此ServerSocket的连接

Socket socket = serverSocket.accept();

System.out.println("已连接");

// 获得输入流,获得用户的请求

InputStream is = socket.getInputStream();

//封装了InputStream is,

BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info;

while ((info = br.readLine()) != null) {

System.out.println("客户端说:" + info);

}

// 给客户端一个响应

String reply = "欢迎登陆";

// 通过输出流将响应发送回客户端

OutputStream os = socket.getOutputStream();

os.write(reply.getBytes());
// 释放相应资源

os.close();

br.close();

is.close();

socket.close();

serverSocket.close();



} catch (IOException e) {

e.printStackTrace();

}}}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值