8.9.网络编程_Socket 远程调用机制
1.网络编程
1.1.网络编程概述:
通过通信线路(有线或无线)可以把不同地理位置且相互独立的计算机连同其外部设备连接起来,组成计算机网络。在操作系统、网络管理软件及网络
通信协议的管理和协调下,可以实现计算机之间的资源共享和信息的传递
网络编程是指用来实现网络互联的不同计算机上运行的程序间可以进行数据交换。对我们来说即如何用编程语言 java 实现计算机网络中不同计算机之间
的通信
1.2.网络通信三要素
1.2.1:IP 地址: 网络中计算机的唯一标识;32bit(4 字节),一般用“点分十进制”表示,如 192.168.1.158;
IP 地址=网络地址+主机地址 可分类:

Java 编程中可使用 InetAddress 类来操纵 IP 地址
public static void main(String[] args) throws UnknownHostException {
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost.getHostAddress());
System.out.println(localHost.getHostName());
}
1.2.2:端口号:用于标识进程的逻辑地址,不同进程的标识;有效端口:0-65535,其中 0-1024 系统使用或保留端口
1.2.3:传输协议 :通讯的规则常见协议: UDP(用户数据报协议)、TCP(传输控制协议)

1.3. 网络模型
计算机网络之间以何种规则进行通信,就是网络模型所研究的问题
网络模型一般是指 OSI 七层参考模型和 TCP/IP 五层参考模型

每一层实现各自的功能和协议,并且都为上一层提供业务功能。为了提供这种业务功能,下一层将上一层中的数据并入到本层的数据域中,
然后通过加入报头或报尾来实现该层业务功能,该过程叫做数据封装。用户的数据要经过一次次包装,最后转化成可以在网络上传输的信号,
发送到网络上。当到达目标计算机后,再执行相反的数据拆包过程

1.物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。主要作用是将数据最终编码为用 0、1
标识的比特流,通过物理介质传输。这一层的数据叫做比特
2.数据链路层:主要将接收到的数据进行 MAC 地址(网卡地址)的封装与解封装。常把这一层的数据叫做帧。这一层常工作的设备是交换机
3.网络层:主要将接收到的数据进行 IP 地址的封装与解封装。常把这一层的数据叫做数据包。这一层设备是路由器
4.传输层:定义了一些数据传输的协议和端口号。主要将接收的数据进行分段和传输,到达目的地址后在进行重组。常把这一层的数据叫做段
5.会话层:通过传输层建立数据传输的通路。主要在系统之间发起会话或者接收会话请求
6.表示层:主要进行对接收数据的解释、加密与解密、压缩与解压缩。确保一个系统的应用层发送的数据能被另一个系统的应用层识别
7.应用层:主要是为一些终端应用程序提供服务。直接面对着用户的
1.4.Socket 远程调用机制
4.1.Socket 概述
Socket,又称为套接字,用于描述 IP 地址和端口。应用程序通常通过 socket向网络发出请求或者应答网络请求。
Socket 就是为网络编程提供的一种机制:通信两端都有 socket;网络通信其实就是 socket 之间的通信;数据在两个 socket 之间通过 IO 传输。
网络编程也称作为 Socket 编程,套接字编程。Socket通信是 Client/Server 模型
4.2.基于 UDP 协议的 Socket 通信:核心类:DatagramSocket
客户端:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
* Created by Administrator on 2018/6/7.
*/
public class SocketUDP {
public static void main(String[] args) throws Exception {
// 创建发送端 Socket 服务对象
DatagramSocket dSocket = null;
try {
dSocket = new DatagramSocket();
// 创建数据,打包数据
String message = "hello ,are u UDP ?";
byte[] bys = message.getBytes();
int length = bys.length;
InetAddress address = InetAddress.getByName("localhost");
int port = 12621;
DatagramPacket dPacket = new DatagramPacket(bys, length, address, port);
// 发送数据
dSocket.send(dPacket);
// 资源释放
dSocket.close();
} catch (SocketException e) {
e.printStackTrace();
}
}
}
接收端:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress; /**
* Created by Administrator on 2018/6/7.
*/
public class SocketUDPServer {
public static void main(String[] args) throws Exception {
//创建接收端 Socket 服务对象
DatagramSocket dSocket = new DatagramSocket(12621);
//创建数据包(接收容器)
byte[] bys = new byte[1024];
DatagramPacket dPacket = new DatagramPacket(bys, bys.length);
//调用接收方法
dSocket.receive(dPacket);
//数据包解析
InetAddress address = dPacket.getAddress();
String hostAddress = address.getHostAddress();
byte[] data = dPacket.getData();
String message = new String(data);
System.out.println(hostAddress+"*********:"+message);
//资源释放
dSocket.close();
}
}
4.3. 基于 TCP 协议的 Socket 通信
客户端 :核心 API:Socket
import java.io.OutputStream;
import java.net.Socket; /**
* Created by Administrator on 2018/6/7.
*/
public class SocketTCPClient {
public static void main(String[] args) throws Exception{
//创建客户端的 socket 服务,指定目的主机和端口
Socket s = new Socket("127.0.0.1", 13131);
//通过 socket 获取输出流,写数据
OutputStream outputStream = s.getOutputStream();
outputStream.write("hello ,this is tcp?".getBytes());
//释放资源
s.close();
}
}
服务端 :核心 API:ServerSocket
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket; /**
* Created by Administrator on 2018/6/7.
*/
public class SocketTCPServer {
public static void main(String[] args) throws Exception {
//建立服务端 socket 服务,并且监听一个端口
ServerSocket ss = new ServerSocket(13131);
//监听连接
Socket s = ss.accept();
//获取输入流,读取数据
InputStream inputStream = s.getInputStream();
byte[] bys = new byte[1024];
int len = inputStream.read(bys);
System.out.println(new String(bys, 0, len));
//关闭客户端
s.close();
//关闭服务端,一般服务端不关闭
ss.close();
}
}
服务端代码2:
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket; public class ServiceServer { public static void main(String[] args) throws Exception { // 创建一个serversocket,绑定到本机的8899端口上
ServerSocket server = new ServerSocket();
server.bind(new InetSocketAddress("localhost", 8899)); // 接受客户端的连接请求;accept是一个阻塞方法,会一直等待,直到有客户端请求连接才返回
while (true) {
Socket socket = server.accept();
//业务实现
new Thread(new ServiceServerTask(socket)).start();
}
}
}
业务类:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket; public class ServiceServerTask implements Runnable{
Socket socket ;
InputStream in=null;
OutputStream out = null; public ServiceServerTask(Socket socket) {
this.socket = socket;
} //业务逻辑:跟客户端进行数据交互
@Override
public void run() {
try {
//从socket连接中获取到与client之间的网络通信输入输出流
in = socket.getInputStream();
out = socket.getOutputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in));
//从网络通信输入流中读取客户端发送过来的数据
//注意:socketinputstream的读数据的方法都是阻塞的
String param = br.readLine(); /**
* 可以根据客户端发过来的调用类名、调用方法名、调用该参数来灵活调用
* 《反射》
*/ GetDataServiceImpl getDataServiceImpl = new GetDataServiceImpl();
String result = getDataServiceImpl.getData(param); //将调用结果写到sokect的输出流中,以发送给客户端
PrintWriter pw = new PrintWriter(out);
pw.println(result);
pw.flush(); } catch (IOException e) { e.printStackTrace();
}finally{
try {
in.close();
out.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
接口类:
public class GetDataServiceImpl {
public String getData(String param){
return "ok-"+param;
}
}
客户端:
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket; public class ServiceClient { public static void main(String[] args) throws Exception { /*ServiceIterface service = ProxyUtils.getProxy(ServiceIterface.class,"methodA",hostname,port);
Result = service.methodA(parameters);*/ // 向服务器发出请求建立连接
Socket socket = new Socket("localhost", 8899);
// 从socket中获取输入输出流
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream(); PrintWriter pw = new PrintWriter(outputStream);
pw.println("hello");
pw.flush(); BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
String result = br.readLine();
System.out.println(result); inputStream.close();
outputStream.close();
socket.close();
}
}
8.9.网络编程_Socket 远程调用机制的更多相关文章
- python网络编程05 /TCP阻塞机制
python网络编程05 /TCP阻塞机制 目录 python网络编程05 /TCP阻塞机制 1.什么是拥塞控制 2.拥塞控制要考虑的因素 3.拥塞控制的方法: 1.慢开始和拥塞避免 2.快重传和快恢 ...
- Flex远程调用机制RemoteObject应用技巧
转自:http://zerozone.javaeye.com/blog/60846Flex远程调用RemoteObject出现的问题及解答: 本文主要讨论Flex在客户端与J2EE中间层数据交互的过程 ...
- Python_网络编程_socket()
什么是 Socket? Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. 详细资 ...
- 【vc】14_网络编程_socket编程
1.计算机网络基本知识 最简单的网络程序如图: 提示:IP地址就相当于一个公司的总机号码,端口号就相当于分机号码.在打电话时,拨通总机后,还需要转到分机上. (1)协议 ·为进行网络中的数据交换(通信 ...
- android网络编程_socket(一)
转载http://www.eoeandroid.com/thread-97477-1-1.html 小知识点:UDP协议和TCP协议的不同.UDP是把数据都打成数据包,数据包上自带通信的地址,但是数据 ...
- 15 [网络编程]-ssh远程命令
1.执行命令os.system('ls') os.system 返回1 or 0 ,不能当做数据发送 # windows # dir 查看某个文件夹下子自文件名与子文件夹名 # ipconfig 查 ...
- Hadoop远程调用机制
- 架构设计:一种远程调用服务的设计构思(zookeeper的一种应用实践)
在深入学习zookeeper我想先给大家介绍一个和zookeeper相关的应用实例,我把这个实例命名为远程调用服务.通过对这种应用实例的描述,我们会对zookeeper应用场景会有深入的了解. 远程调 ...
- 《安卓网络编程》之第一篇 java环境下模拟客户端、服务器端
1.Socket简介 在网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket是TCP/IP协议的一个 ...
随机推荐
- docker 导出多个镜像合并成一个tar
导出单个镜像 docker save [images] > [name.tar] 倒出多个镜像合并成一个tar包 docker save [images] [images] > [name ...
- Visual Studio Code的设置及插件同步
Visual Studio Code的设置及插件同步 使用Visual Studio Code开发有一段时间了,用起来是极其的顺手,但是唯独一点不爽的就是,Visual Studio Code不像Vi ...
- PI膜热作用机理
一.热分析法: 二.研究成果 1.PI膜热老化机理 实验条件:8根500w的碘钨灯加热,200倍光学显微镜观察,PI膜的技术指标 实验概述:本研究分别以150 ℃ , 175 ℃ , 200 ℃ , ...
- 【并行计算-CUDA开发】显卡两大生产商
ATI显卡 ATI显卡即AMD显卡.俗称A卡.搭载AMD公司出品的显示芯片.与NVIDIA齐名,同为世界两大显示芯片厂商. 不同的是AMD不是只有显卡,而且还出品CPU(处理器),其AMD处理器与In ...
- 「java.util.concurrent并发包」之 CyclicBarrier
一 描述 CyclicBarrier初始化时规定一个数目,然后计算调用了CyclicBarrier.await()进入等待的线程数.当线程数达到了这个数目时,所有进入等待状态的线程被唤醒并继续.Cyc ...
- 红米K20PRO解锁Bootloader权限并刷入recovery
手机里反正没什么东西了,聊天记录啊好像也没很重要得了,索性全部清除,刷机玩玩. 把稳定版刷成第三方开发版,这样又有时间去折腾root权限,面具和xposed的各种插件了,嘿嘿. 解锁小米手机 我的账号 ...
- Sublime Text 3配置浏览默认路径为localhost
1.在 Sublime Text 3 中,安装 SideBarEnhancements 侧边栏增强插件.(注意:安装插件之前需要安装包管理工具,参考这里) 2.SideBarEnhancements ...
- 换发型app任性扣费?苹果app订阅任性扣费?怎么办?刚成功
2019年9月18日17:09:27 什么黑猫举报没用 先关闭订阅 账户中心自助申请试试,不通过再进行下面这步 https://getsupport.apple.com/?caller=home&am ...
- 单元操作和仓储模式 repository+unitOfWork
仓储和工作单元模式是用来在数据访问层和业务逻辑层之间创建一个抽象层.应用这些模式,可以帮助用来隔离你的程序在数据存储变化. 在数据源层和业务层之间增加一个repository层进行协调,有如下作用:1 ...
- 移动端真机debug调试神器 vConsole学习(二)之实战
项目中实际使用 在项目中实际使用的时候发现还是有很多问题的 最初使用方式 <script src="vconsole.min.js"></script> ...