socket通信

java socket 之UDP编程

喜欢而已 提交于 2020-02-28 13:54:37
一、概念 在TCP的所有操作中都必须建立可靠的连接,这样一来肯定会浪费大量的系统性能,为了减少这种开销,在网络中又提供了另外的一种传输协议——UDP,不可靠的连接(这种协议在各种聊天工具中被广泛使用)。 在UDP程序的开发中使用DatagramPacket包装一条要发送的信息,之后使用DatagramSocket用于完成信息的发送操作。 例如:现在使用聊天工具进行聊天,那么A发送的信息B不一定能够接收的到,因为使用的就是UDP协议。 基于UDP通信的基本模式: (1)将数据打包,称为数据包(好比将信件装入信封一样),然后将数据包发往目的地。 (2)接受别人发来的数据包(好比接收信封一样),然后查看数据包中的内容。 以下用一个聊天程序来说明,功能效果如下图所示: 二、工程目录 三、服务端 1)UDPServer类,服务端主类 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame;

Python Select 解析

怎甘沉沦 提交于 2020-02-18 07:13:43
首先列一下,select、poll、epoll三者的区别 select select最早于1983年出现在4.2BSD中,它通过一个select()来调用系统监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,使得进程可以获得这些文件描述符从而进行后续的读写操作。 select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点,事实上从现在看来,这也是它所剩不多的优点之一。 select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,不过可以通过修改宏定义甚至重新编译内核的方式提升这一限制。 另外,select()所维护的存储大量文件描述符的数据结构,随着文件描述符数量的增大,其复制的开销也线性增长。同时,由于网络响应时间的延迟使得大量TCP连接处于非活跃状态,但调用select()会对所有socket进行一次线性扫描,所以这也浪费了一定的开销。 poll poll在1986年诞生于System V Release 3,它和select在本质上没有多大差别,但是poll没有最大文件描述符数量的限制。 poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。

为什么静态域与网络传输无关

有些话、适合烂在心里 提交于 2020-02-09 07:26:36
首先静态域与网络传输没有关系,静态域不可以被序列化,也不会在网络中被传输。我们先通过一个例子验证这个问题,后面再分析静态域到底是怎样的一种存在。 以下是一个socket通信过程,Client端负责实例的构造和发送,Server端负责监听和接收来自端口的实例,User类拥有静态变量和成员变量,这里将User的实例作为目标进行传输。 import java.io.*; import java.net.Socket; /** * User: zzzz76 * Date: 2018-07-07 */ public class Client { public static void main(String[] args) throws Exception { User.setTag("client"); for (int i = 0; i < 5; i++) { Socket socket = null; BufferedOutputStream bos = null; ObjectOutputStream oos = null; try { socket = new Socket("localhost", 10000); bos = new BufferedOutputStream(socket.getOutputStream()); oos = new

nginx worker进程循环

梦想的初衷 提交于 2020-02-04 12:46:09
  worker进程启动后,其首先会初始化自身运行所需要的环境,然后会进入一个循环,在该循环中不断检查是否有需要执行的事件,然后处理事件。在这个过程中,worker进程也是需要与master进程交互的,更有甚者,worker进程作为一个子进程,也是可以接收命令行指令(比如kill等)以进行相应逻辑的处理的。那么worker进程是如何与master或者命令行指令进行交互的呢?本文首先会对worker进程与master进程交互方式,以及worker进程如何处理命令行指令的流程进行讲解,然后会从源码上对worker进程交互的整个工作流程进行介绍。      1. worker与master进程交互方式      这里首先需要说明的是,无论是master还是外部命令的方式,nginx都是通过标志位的方式来处理相应的指令的,也即在接收到一个指令(无论是master还是外部命令)的时候,worker会在其回调方法中设置与该指令相对应的标志位,然后在worker进程在其自身的循环中处理完事件之后会依次检查这些标志位是否为真,是则根据该标志位的作用执行相应的逻辑。      对于worker进程与master进程的交互,其是通过socket管道的方式进行的。在ngx_process.h文件中声明了一个ngx_process_t结构体,这里我们主要关注其channel属性:      typedef

linux 进程守护工具 supervisor 使用概述

痞子三分冷 提交于 2020-02-04 06:36:00
前言 以前跑代码,为了不被杀掉经常用 nohup + &,后来发现,系统认为该死的程序都得死,这就很郁闷,市面上有很多进程守护的工具,只是写的语言不同而已(例如pm2,用node语言写的),supervisor用python写的,以前支持py2,现在py3也支持,所以不用担心版本问题。我这里把一些常规的使用介绍一下,顺便说一下有任何问题查阅官网: supervisor官网 一. 安装 安装方式多种多样, 离线安装:(公司内网不和外网连通)需要提前下好安装包,用make和make install 编译安装,稍微复杂点,这里不多说,有需要就自己研究一下。 在线安装:因为supervisor是python写的,所以可以直接 pip install supervisor 进行安装;或者 yum install supervisor 进行安装;首推pip方式。 二.配置 supervisor的所有启动设置都只在一个配置文件中进行,这个配置文件是唯一且最重要的。 生成配置文件:运行 echo_supervisord_conf 命令重定向到一个文件 echo_supervisord_conf > /home/flask_pro/supervisor_config/supervisord.conf /home/flask_pro/ 这个目录是我自己建的一个flask项目的目录,

Java网络编程技术1

懵懂的女人 提交于 2020-02-03 16:08:40
1. Java网络编程常用API 1.1 InetAddress类使用示例 1.1.1根据域名查找IP地址 获取用户通过命令行方式指定的域名,然后通过InetAddress对象来获取该域名对应的IP地址。当然,程序运行时,需要计算机正常连接到Internet上。 例1. 根据域名查找IP地址 package Net; import java.net.InetAddress; import java.net.UnknownHostException; public class GetIP { public static void main(String[] args) { try { InetAddress ad = InetAddress.getByName(args[0]); //ad.getHostAddress()方法获取当前对象的IP地址 System.out.println("IP地址为:"+ad.getHostAddress()); } catch (UnknownHostException e) { e.printStackTrace(); } } } 想获取网易的IP地址,就应该输入:java GetIP www.163.com 例2. 获取本机的IP地址。 package Net; import java.net.*; public class GetMyIP {

一个故事讲清楚NIO

試著忘記壹切 提交于 2020-01-30 07:40:32
from : https://www.cnblogs.com/LBSer/p/4853234.html 你应该知道的 RPC原理    在学校期间大家都写过不少程序,比如写个 hello world服务类,然后本地调用下,如下所示。这些程序的特点是服务消费方和服务提供方是本地调用关系。   而一旦踏入公司尤其是大型互联网公司就会发现,公司的系统都由成千上万大大小小的服务组成,各服务部署在不同的机器上,由不同的团队负责。这时就会遇到两个问题: 1)要搭建一个新服务,免不了需要依赖他人的服务,而现在他人的服务都在远端,怎么调用? 2)其它团队要使用我们的新服务,我们的服务该怎么发布以便他人调用?下文将对这两个问题展开探讨。 1 public interface HelloWorldService { 2 String sayHello(String msg); 3 } 1 public class HelloWorldServiceImpl implements HelloWorldService { 2 @Override 3 public String sayHello(String msg) { 4 String result = "hello world " + msg; 5 System.out.println(result); 6 return result; 7 } 8

java简单聊天 网络编程

ぐ巨炮叔叔 提交于 2020-01-28 08:35:42
demo1(单线程简单通讯)io流 服务端 public class Server { public static void main(String[] args) throws Exception { //5.创建ServerSocket、Socket、OutputStream、InputStream以及端口号并初始化 ServerSocket serverSocket = null; boolean flag = true; Socket socket = null; OutputStream out = null; InputStream in = null; try { //6.开启服务器并接收客户端发送的数据 serverSocket = new ServerSocket(8000);//创建服务器套接字 System.out.println("服务器开启,等待连接..."); socket = serverSocket.accept();//获得连接 //接收客户端发送的内容 in = socket.getInputStream(); //7.使用输出流对象将信息返回给客户端 out = socket.getOutputStream(); System.out.println(socket.getInetAddress().getHostAddress() + "--

自己动手模拟开发一个简单的Web服务器

寵の児 提交于 2020-01-25 17:28:56
开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的Web服务器来体会一下。 一、请求-处理-响应模型 1.1 基本过程介绍   每一个HTTP请求都会经历三个步凑: 请求-处理-响应 :每当我们在浏览器中输入一个URL时都会被封装为一个HTTP请求报文发送到Web服务器,而Web服务器则接收并解析HTTP请求报文,然后针对请求进行处理(返回指定的HTML页面、CSS样式表、JS脚本文件亦或是加载动态页面生成HTML并返回)。最后将要返回的内容转为输出流并封装为HTTP响应报文发送回浏览器。   当然,浏览器接收到响应报文后会加载HTML、CSS与JS并显示在页面中,最后成为我们看到的最终效果。 1.2 通信过程介绍   Web服务器本质上来说就是一个 Socket服务端 ,在不停地接受着客户端的请求,然后针对每一个客户端的请求进行处理,处理完毕就 即时关闭 连接。而我们的浏览器则是一个 Socket客户端 ,通过 TCP协议 向服务端发送 HTTP请求报文 。 About: Socket非常类似于电话插座,以一个电话网为例:电话的通话双方相当于相互通信的2个程序,电话号码就是IP地址。任何用户在通话之前,首先要占有一部电话机

关于TCP通信的实现(c++)

久未见 提交于 2020-01-21 15:58:46
  TCP通信机制,采用全双工(就是既可以发送数据,也可以接收数据)的形式进行客户端和服务器之间的链接,并且这是一种可靠数据传输(数据在进行收发的过程中并不会进行损失),并非UDP那样,详细细节,为什么可靠传输,可以参考《计算机网络——自顶向下》,以下代码均采用c++的模式进行实现   1.TCP------Server #pragma warning(disable:4996); #include <iostream> #include<winsock2.h> #include<windows.h> using namespace std; #pragma comment(lib,"ws2_32.lib") class TCP { public: void check_version(); void intintail(); void blind_listen(); void sent_recv(); private: WSADATA data; SOCKET sock_server; SOCKET sock_client; SOCKADDR_IN add_server; SOCKADDR_IN add_client; }; int main() { TCP a; a.check_version(); a.intintail(); a.blind_listen(); a.sent