socket

Java Socket实战之二 多线程通信

落花浮王杯 提交于 2020-11-05 14:21:52
本文地址:http://blog.csdn.net/kongxx/article/details/7259465 Java Socket实战之一 单线程通信 上一篇文章说到怎样写一个最简单的Java Socket通信,但是在上一篇文章中的例子有一个问题就是Server只能接受一个Client请求,当第一个Client连接后就占据了这个位置,后续Client不能再继续连接,所以需要做些改动,当Server没接受到一个Client连接请求之后,都把处理流程放到一个独立的线程里去运行,然后等待下一个Client连接请求,这样就不会阻塞Server端接收请求了。每个独立运行的程序在使用完Socket对象之后要将其关闭。具体代码如下: package com.googlecode.garbagecan.test.socket.sample2; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class MyServer { public static void main

Java Socket多线程异步通信

非 Y 不嫁゛ 提交于 2020-11-05 11:21:21
服务端 package com.ninemax.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class SocketServer { public static void main(String[] args) { try { // 监听端口 ServerSocket server = new ServerSocket(9999); // 获取客户端链接 Socket client = server.accept(); // 获取客户端输入流 BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); // 获取客户端输出流 PrintWriter out = new PrintWriter(client.getOutputStream()); // 获取系统输入流 BufferedReader sys_in = new

netty学习笔记

旧时模样 提交于 2020-10-30 07:09:36
1、在没有任何encoder、decoder的情况下,Netty发送接收数据都是按照ByteBuf的形式,其它形式都是不合法的。 ByteBuf result = (ByteBuf) msg; byte[] data = new byte[result.readableBytes()]; result.readBytes(data); String resultStr = new String(data); // 接收并打印客户端的信息 System.out.println("Client said:" + resultStr); // 释放资源,这行很关键 result.release(); // 向客户端发送消息 String response = "I am ok!"; // 在当前场景下,发送的数据必须转换成ByteBuf数组 ByteBuf encoded = ctx.alloc().buffer(4 * response.length()); encoded.writeBytes(response.getBytes()); ctx.write(encoded); ctx.flush(); 2、接收发送数据操作都是通过handler实现的,handler在netty中占据了非常重要的位置。 class HelloServerInHandler extends

php Socket 入门例子

你离开我真会死。 提交于 2020-04-24 17:13:07
<?php /* 设置不显示任何错误 */ error_reporting(0); /* 脚本超时为无限 */ set_time_limit(0); /* 开始固定清除 */ ob_implicit_flush(); /* 服务器端的IP和需要开放的端口 */ $address = '192.168.1.2'; $port = 10000; /* 产生一个Socket */ if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) { echo "socket_create() failed: reason: " . socket_strerror($sock) . "\n"; } /* 把IP地址端口进行绑定 */ if (($ret = socket_bind($sock, $address, $port)) < 0) { echo "socket_bind() failed: reason: " . socket_strerror($ret) . "\n"; } /* 监听Socket连接 */ if (($ret = socket_listen($sock, 5)) < 0) { echo "socket_listen() failed: reason: " . socket_strerror($ret)

linux下异步RPC的阶段性总结-非阻塞SOCKET客户端

眉间皱痕 提交于 2020-04-10 18:36:11
尽可能使用非阻塞socket int flags, s; flags = fcntl (fd, F_GETFL, 0); if (flags == -1){ close(fd); return -1; } flags |= O_NONBLOCK; s = fcntl (fd, F_SETFL, flags); if (s == -1){ close(fd); return -1; } 使用效率高效的epoll机制获取多个socket上的IN/OUT事件 非阻塞socket连接服务端时,不一定立即连接得上服务器 通过判断connect函数的返回值和错误号做进一步跟踪 int ret = ::connect(this->fd, (struct sockaddr*)&(server_addr), sizeof(server_addr)); if(ret == 0){ this->on_connected(); }else if(ret < 0 && errno != EINPROGRESS){ //error }else{ on_connecting(); } IN/OUT事件时如果是connecting需要判断socket状态,socket reset发生时也会产生事件,然后才进入有效的读写 if(this->connect_status == 1){//connecting int

网络编程

限于喜欢 提交于 2020-04-07 21:16:35
一.楔子 你现在已经学会了写python代码,假如你写了两个python文件a.py和b.py,分别去运行,你就会发现,这两个python的文件分别运行的很好。但是如果这两个程序之间想要传递一个数据,你要怎么做呢? 这个问题以你现在的知识就可以解决了,我们可以创建一个文件,把a.py想要传递的内容写到文件中,然后b.py从这个文件中读取内容就可以了。 但是当你的a.py和b.py分别在不同电脑上的时候,你要怎么办呢? 类似的机制有计算机网盘,qq等等。我们可以在我们的电脑上和别人聊天,可以在自己的电脑上向网盘中上传、下载内容。这些都是两个程序在通信。 回到顶部 二.软件开发的架构 我们了解的涉及到两个程序之间通讯的应用大致可以分为两种: 第一种是应用类:qq、微信、网盘、优酷这一类是属于需要安装的桌面应用 第二种是web类:比如百度、知乎、博客园等使用浏览器访问就可以直接使用的应用 这些应用的本质其实都是两个程序之间的通讯。而这两个分类又对应了两个软件开发的架构~ 1.C/S架构 C/S即:Client与Server ,中文意思:客户端与服务器端架构,这种架构也是从用户层面(也可以是物理层面)来划分的。 这里的客户端一般泛指客户端应用程序EXE,程序需要先安装后,才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大。 2.B/S架构 B/S即:Browser与Server

JAVA-超大文件上传-如何上传文件-大文件上传

百般思念 提交于 2020-04-07 17:53:14
java两台服务器之间,大文件上传(续传),采用了Socket通信机制以及JavaIO流两个技术点,具体思路如下: 实现思路: 1、服:利用ServerSocket搭建服务器,开启相应端口,进行长连接操作 2、服:使用ServerSocket.accept()方法进行阻塞,接收客户端请求 3、服:每接收到一个Socket就建立一个新的线程来处理它 4、客:利用Socket进行远程连接,询问已上传进度 5、客:使用FileInputStream.skip(long length)从指定位置读取文件,向服务器发送文件流 6、服:接收客户端输入流,使用RandomAccessFile.seek(long length)随机读取,将游标移动到指定位置进行读写 7、客/服:一个循环输出,一个循环读取写入 8、示例:以下是具体代码,仅供参考 文件介绍: FileUpLoadServer.java(服务器接收文件类) FileUpLoadClient.java(客户端发送文件类) FinalVariables.java(自定义参数类) SocketServerListener.java(JavaWeb启动Socket操作类) web.xml(配置文件,跟随项目启动) 断点上传(服务端) package com.cn.csdn.seesun2012.socket; import java.io

分享开发soket经验 我的基于socket的持久层

旧巷老猫 提交于 2020-04-07 16:17:46
前言 本项目Pixysoft.Framework.Noebe.Sockets,是把数据库的操作用socket暴露出来,实现局域网的调用。 不支持穿越防火墙、不支持局域网-公网链接、不支持路由。 作品完成后,能够通过这个框架,把众多异构数据库链接成一个庞大的数据库池(云??) 开发过程 第一阶段 自以为是 刚开始,网上搜索了几个socket的局域网聊天的例子,用同步的方法实现的。 链接在这里: http://www.pudn.com/downloads40/sourcecode/p2p/detail138986.html 2天时间我就搞了个prototype,本机调用一点问题都没有。还有点沾沾自喜,以为自己牛逼了,2天搞好了个socket 的服务器。 结果一部署,问题来了。 服务器正在传输数据,但是本地收了10%不到就断了。用thread去等待简直就是放屁,谁知道thread等到什么时候。就算把数据偏移量也传递过去,一样断。 第二阶段 认真对待 一下子受了挫折,开始认真搜索资料。在codeprojects和cnblogs找到了异步socket的例子,特别是NCindy这个非常的好,有个很简单的异步模型例子 http://www.cnblogs.com/ncindy/archive/2006/11/01/547143.html 于是新的解决方案: 1. 使用异步做服务器 2.

epoll 简单介绍

喜欢而已 提交于 2020-04-07 13:43:02
Linux 2.6内核中提高网络I/O性能的新方法-epoll I/O多路复用技术在比较多的TCP网络服务器中有使用,即比较多的用到select函数。 1、为什么select落后 首先,在Linux内核中,select所用到的FD_SET是有限的,即内核中有个参数__FD_SETSIZE定义了每个FD_SET的句柄个数,在我用的2.6.15-25-386内核中,该值是1024,搜索内核源代码得到: include/linux/posix_types.h: #define __FD_SETSIZE 1024 也 就是说,如果想要同时检测1025个句柄的可读状态是不可能用select实现的。或者同时检测1025个句柄的可写状态也是不可能的。其次,内核中实现 select是用轮询方法,即每次检测都会遍历所有FD_SET中的句柄,显然,select函数执行时间与FD_SET中的句柄个数有一个比例关系,即 select要检测的句柄数越多就会越费时。当然,在前文中我并没有提及poll方法,事实上用select的朋友一定也试过poll,我个人觉得 select和poll大同小异,个人偏好于用select而已。 2、内核中提高I/O性能的新方法epoll epoll是什么?按照man手册的说法:是为处理大批量句柄而作了改进的poll。要使用epoll只需要这三个系统调用:epoll_create

JMeter如何模拟不同的网络速度

好久不见. 提交于 2020-04-07 10:39:24
如何以不同的网络连接速度测试移动应用程序和网站? 在大多数情况下,移动设备用户通过其蜂窝运营商网络访问互联网。覆盖范围将根据其位置而有所不同,这意味着连接速度将有所不同。确保您的网站或应用程序能够完全处理移动设备和平板电脑,即使它们具有不同的互联网连接速度,也至关重要。 在今天的文章中,将展示如何通过在 JMeter 负载测试中控制模拟虚拟用户的带宽来做到这一点。 默认情况下,JMeter将尽快发送其采样器定义的请求。这对于产生负载非常有用,但不是很现实,因为实际用户不会不停地访问服务器,因此他们需要一些时间在两次操作之间进行人生思考。最重要的是,移动用户受到网络带宽的限制,这可能会进一步降低他们的速度。 限制输出带宽以模拟不同的网络速度 JMeter 确实提供了限制输出带宽以模拟不同网络速度的选项。可以通过以下两个属性来控制带宽: httpclient.socket.http.cps = 0 httpclient.socket.https.cps = 0 这些分别用于 HTTP 和HTTPS协议, 图解HTTP脑图 。该属性默认为零,这意味着没有限制。首字母缩写 cps 代表“每秒字符数”。当您将属性设置为零以上时,带宽将根据您的设置进行调节。 这是计算“cps”的公式: cps=(目标带宽(以kbps为单位*1024)/8 例如:为了模拟 GPRS 蜂窝网络速度