Socketchannel写入/读取大量数据问题

我有一个客户端,一个服务端,现在要在服务端截图给客户端,每张图片大概20W字节(200KB)不到
请问socketchannel可以一次性写入这20W字节吗,
就是socketchannel.write(bytebuffer);
bytebuffer的limit就是20W不到,这样写入会不会出问题
顺便问问socketchannel的write是异步的吗。。看源码怎么是一个抽象方法

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
求教Java.Nio 中SocketChannel 写入数据的问题
### 请问SocketChannel 写入大一点的数据时该如何处理 ![图片说明](https://img-ask.csdn.net/upload/201901/18/1547780789_544042.png) ###这个方法如何用循环完善,不然数据稍微大点就会报错 /** * 把指定的字符串按照默认编码转化成byte字节流写入到socket channel中 * @param channel * @param buffer * @param str * @throws IOException */ public static void wirteCmd(SocketChannel channel,ByteBuffer buffer,String str) throws IOException{ buffer.clear(); byte[] bytes=str.getBytes(); buffer.put(bytes); buffer.flip(); channel.write(buffer); buffer.clear(); } ``` ```
关于Socket与SocketChannel的数据读写问题?
客户端读不到数据??一直处于阻塞状态...问题在服务器端还是客户端? 服务器端发送数据: ``` Iterator<SocketChannel> it=clients.iterator(); System.out.println(clients.size()); while(it.hasNext()){ SocketChannel channel=it.next(); System.out.println("send message to"+channel.socket().getInetAddress()+":"+content.toString()); channel.write(ByteBuffer.allocate(content.length()+2).put((content.toString()+"\r\n").getBytes())); } ``` 客户端读数据: 注意:客户端是使用的Socket,服务器使用的是Channel ``` public void run() { BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader( socket.getInputStream())); while (!stop) { System.out.println(br.readLine()); System.out.println("end"); } } catch (IOException e) { e.printStackTrace(); } finally { Resources.close(br); } } ```
SocketChannel bind()地址的问题
![图片说明](https://img-ask.csdn.net/upload/201707/14/1500011273_734777.png) 上面的图片是我截取的一部分代码, 是放在while死循环里面的一段.. 因为执行起来很快,不知道循环到多少次的时候开始,每次执行到bind那里的时候,都会出现 如下的异常: ![图片说明](https://img-ask.csdn.net/upload/201707/14/1500011406_563803.png) 上网搜索了下,那个异常主要是因为端口已经被其他线程所绑定,但是, 我这里使用的是socketchannel,是作为客户端,又不是服务器,也就是说绑定的是一个远程的地址(这里使用的是本机回传地址),那么问题来了,难道一个服务器端口只能被一个客户端绑定?咋那么回事?
SocketChannel write数据不完整的问题
我用JAVA NIO写的服务端与客户端的Socket连接程序,服务端发送信息,客户端接收信息,服务端发送信息的代码如下图:![图片说明](https://img-ask.csdn.net/upload/201904/02/1554188180_511494.jpg),遇到的问题也在图中,请问各位如何解决,先谢谢
关于nio中的SocketChannel.read()方法原理
<div class="iteye-blog-content-contain" style="font-size: 14px;"> <p>发起请求的代码:</p> <pre name="code" class="java">SocketChannel socketChannel = SocketChannel.open(); socketChannel.connect(new InetSocketAddress("http://www.test.com", 80));</pre> <p>1)如果请求返回的数据总量是1000byte;这时这1000byte是不是已经返回到客户端了?</p> <p> </p> <p>从SocketChannel中读取数据:</p> <pre name="code" class="java">int bytesRead = socketChannel.read(buf);</pre> <p> </p> <p>2)如果buf大小是1byte,只执行一次read方法后,那剩余的999byte数据在哪里呢?</p> </div>
NIO SocketChannel连接报错
private static void testSocketChannel() throws IOException{ SocketChannel socketChannel = SocketChannel.open(); socketChannel.configureBlocking(false); socketChannel.connect(new InetSocketAddress(10086)); while(!socketChannel.finishConnect()){ System.out.println("connecting...."); try { Thread.currentThread().sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("connect success!!"); } 代码如图所以,设想是在连接成功之前,控制台会一直输出connecting....,但运行时只输出2行就报错了。。。。。
SocketChannel发送消息
我在用SocketChannel发送消息时,当第一条消息没有接收到的时候,法第二条就会出现这个错误,请问是什么原因 java.io.IOException: 您的主机中的软件中止了一个已建立的连接。 at sun.nio.ch.SocketDispatcher.read0(Native Method) at sun.nio.ch.SocketDispatcher.read(Unknown Source) at sun.nio.ch.IOUtil.readIntoNativeBuffer(Unknown Source) at sun.nio.ch.IOUtil.read(Unknown Source) at sun.nio.ch.SocketChannelImpl.read(Unknown Source)
Android Socket使用NIO的基础性问题
在尝试向SocketChannel写入数据时出问题了,每次写入后返回的Size都是0,问题代码如下: ``` SocketChannel socketChannel = null; ByteBuffer sendBuffer = null; ``` 下面这是发送数据的函数中一部分 ``` sendBuffer = ByteBuffer.wrap("hello".getBytes("UTF8")); sendBuffer.flip(); int bufferLength = sendBuffer.array().length; int sendsize = 0; while(sendBuffer.hasRemaining()) { sendsize += socketChannel.write(sendBuffer); } sendBuffer.clear(); ``` 问题1:查看了ByteBuffer.flip() 和 ByteBuffer.clear()的代码发现都是改变它的位置指针,flip是把position 和 limit 都置0,而remaining的值是limit - position,这样一来flip之后remaining不总是等于0吗?我的循环就始终没有执行,但是又在几篇帖子里看到说write之前需要先flip,于是很困惑。 问题2:如果不加while语句,不判断remaining而直接write,发现返回的size还是0,就是说没有数据被写到socketChannel里。 还请大侠指点迷津!
Netty作为socket长链接,在windows部署占用38M左右内存,在linux部署占用1.5G左右内存
不知各位有遇到过这样问题的吗? ![图片说明](https://img-ask.csdn.net/upload/201910/19/1571456018_34605.png) 这是在linux部署直接就这样了 关于启动类我给大家粘一下代码 ``` Thread thread = new Thread(new Runnable() { @Override public void run() { //服务端要建立两个group,一个负责接收客户端的连接,一个负责处理数据传输 //连接处理group EventLoopGroup boss = new NioEventLoopGroup(); //事件处理group EventLoopGroup worker = new NioEventLoopGroup(); ServerBootstrap bootstrap = new ServerBootstrap(); // 绑定处理group bootstrap.group(boss, worker).channel(NioServerSocketChannel.class) //保持连接数 .option(ChannelOption.SO_BACKLOG, 100000) //有数据立即发送 .option(ChannelOption.TCP_NODELAY, true) //保持连接 .childOption(ChannelOption.SO_KEEPALIVE, true) //处理新连接 .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel sc) throws Exception { // 增加任务处理 ChannelPipeline p = sc.pipeline(); p.addLast(new IdleStateHandler(new Integer(new ReadProperties().getUrlValue("read.time.seconds")),0,0)); p.addLast(new ServerIdleStateTrigger()); p.addLast(new Decoder()); p.addLast(new Encoder()); p.addLast(new ServerHandler()); } }).option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT).childOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT); //绑定端口,同步等待成功 ChannelFuture future; try { future = bootstrap.bind(serverPort).sync(); if (future.isSuccess()) { serverSocketChannel = (ServerSocketChannel) future.channel(); // System.out.println("服务端开启成功"); // 启动定时删除文件的线程 new Thread(new DeleteFile()).start(); } else { // System.out.println("服务端开启失败"); } //等待服务监听端口关闭,就是由于这里会将线程阻塞,导致无法发送信息,所以我这里开了线程 future.channel().closeFuture().sync(); } catch (Exception e) { // e.printStackTrace(); } finally { //优雅地退出,释放线程池资源 boss.shutdownGracefully(); worker.shutdownGracefully(); } } }); ``` handler类继承SimpleChannelInboundHandler
Socket关闭后,如何清理输出缓冲区来阻止已经在输出缓冲区中的数据发送?
实践发现,当使用socketChannel.close()之后,对于close之前已经写入缓冲区但由于网络原因没有发送成功的数据,在server端网络恢复后,还是能接收到该数据; 求问是否有什么办法能在调用Close之前,将此socketChannel的输出缓冲区中的数据清理掉? 从该博主处得到的:http://blog.csdn.net/Ctrl_qun/article/details/52454380 这些I/O缓冲区特性可整理如下: I/O缓冲区在每个TCP套接字中单独存在; I/O缓冲区在创建套接字时自动生成; 即使关闭套接字也会继续传送输出缓冲区中遗留的数据; 关闭套接字将丢失输入缓冲区中的数据。
NIO中的SocketChannel多次write之后 用read如何做到区分多次的数据
例如socketChannel.write(ByteBuffer) buteBuffer的长度可能随时变更,但是接收的时候read方法是以一个固定的长度接收的 发送方 ```java byte[] outData = new byte[2048]; ByteBuffer outByteBuffer = ByteBuffer.wrap(outData); toWriteNrBytes = 获取数据返回一个长度; outByteBuffer.limit(toWriteNrBytes); socketChannel.write(outByteBuffer); ``` 接收方 ```java byte[] inData = new byte[2048]; ByteBuffer inByteBuffer = ByteBuffer.wrap(inData); readNrBytes = socketChannel.read(inByteBuffer); ``` 可是这个readNrBytes并不能实时的到每次写入的长度,请问怎么解决
netty中怎么实现无限循环给每个客户端发数据?
正在做一个netty服务端,业务是这样的:客户端发数据给服务端,服务端收到之后发一条反馈数据回去;另外服务端需要实时查询数据库,如果有数据就发送给对应客户端,5秒循环一次,我把这两个业务写在同一个channelRead中,结果后者经常出现多次发送数据的情况,好像是多个线程都在执行这个循环,执行的周期不是5秒,5秒内执行了多次,也就是一条数据发了多次且次数不定,不知道是哪里的问题,感觉是自定义线程runnable和netty线程组之间没有协调工作,不知道怎么解决 ``` public class MyHandler extends ChannelHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { 01接收客户端数据,并给予反馈,代码略 //02每五秒钟自动遍历一次数据库,将策略数据发送至指定客户端 Runnable send = new Runnable() { @Override public void run() { Mysend: //for无限循环 for(;;) { try{ Convertion con=new Convertion(); gettacticsdata data=new gettacticsdata(); //读取存储在Map中已登录用户ID Map<String, SocketChannel> map = Mymap.getChannels(); Iterator<String> it = map.keySet().iterator(); //for(int m=0;m<map.size();m++) while (it.hasNext()) { System.out.println("Map集合大小为:"+map.size()); String key = it.next(); System.out.println("key:"+key); SocketChannel obj = map.get(key); //判断当前客户是否在线,如果在线就传数据,不在就删除存储在Map中的登录信息 if(obj.isActive()==true) { data.updatelwzt(key); //查询需要下发的策略B数据 ArrayList Bal=data.GetBdata(key); //判断是否有需要下发的策略 if(Bal.size()>0) { for(int i=0;i<Bal.size();i++) { tacticsBdata Bl=(tacticsBdata) Bal.get(i); byte[] Bdata=con.GetBdata(Bl); //SocketChannel obj = map.get(key); if(Bdata.length==32){ ByteBuf Bsend =Unpooled.copiedBuffer(Bdata); obj.writeAndFlush(Bsend); } } } }else { System.out.println("此ChannelID已掉线: " + obj); String resultdk=data.updatelwztdk(key); map.remove(key); obj.close(); } } } catch(Exception e) { break Mysend; } try { //线程休眠5秒钟后再次启动 Thread.sleep(5000); } catch (InterruptedException e) { //e.printStackTrace(); } } } }; new Thread(send).start(); } @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { ctx.flush(); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { ctx.close(); } ```
java 关于NIO实现UDP数据传输问题 ,急谢谢,C币不足请不要介意
各位大侠好,小弟想问一下问题,搞了一两天没有搞明白的。因为要实现一个UDP传输服务端,于是在网上找了很多资料然后就写了一个。但是写好之后发现有两个很严重的问题,希望各位大哥给点意见或者思路去解决。 问题一:启动服务端,同时也启动客户端,客户端传输数据服务器正常接收,但是断开客户端后,再启动客户端,服务器就收不到任何客户端发送的消息,好像是服务器关闭了UDP一样,但是重启服务器后(重新打开UDP)客户端既可以发送信息过来。 问题二:多个客户端。第一个客户端连接上后,第二个客户端怎么也链接不上了。即使关闭了第一个客户端也一样。 如下是代码: package com.gateway.socket; import java.io.IOException; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.net.UnknownHostException; import java.nio.ByteBuffer; import java.nio.channels.DatagramChannel; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.util.Iterator; import java.util.Set; import org.apache.log4j.Logger; public class UDPEchoServerSelector extends Thread { private static final Logger log = Logger.getLogger(ServerSocket.class); // private InetSocketAddress inetSocketAddress; // socket处理类 private UDPSocketHandler handler = new UDPSocketHandler(); // 注册的接受服务 private SocketReceiver receiver = null; /** * 初始化socket * * @param receiver * @param hostname * @param port * @throws IOException * @throws UnknownHostException */ public UDPEchoServerSelector(SocketReceiver receiver, String hostname, int port) { if (hostname.isEmpty()) { inetSocketAddress = new InetSocketAddress(port); } else { inetSocketAddress = new InetSocketAddress(hostname, port); } this.receiver = receiver; } @Override public void run() { try { Selector selector = Selector.open(); // 创建选择器,可以处理多路通道。 DatagramChannel serverSocketChannel = DatagramChannel.open(); // 打开通道 serverSocketChannel.configureBlocking(false); // 非阻塞 serverSocketChannel.socket().bind(inetSocketAddress); /* * 将通道管理器和该通道绑定,并为该通道注册SelectionKey.OP_READ事件,注册该事件后, * 当该事件到达时,selector.select()会返回,如果该事件没到达selector.select()会一直阻塞。 */ serverSocketChannel.register(selector, SelectionKey.OP_READ, new ClientData()); log.info("Server: socket server started."); /* * 采用轮询的方式监听selector上是否有需要处理的事件,如果有,则进行处理 */ while (true) { // 轮询 // 当注册的事件到达时,方法返回;否则,该方法会一直阻塞 int nKeys = selector.select(); if (nKeys == 0) { continue; } // 得到选择键列表 Set Keys = selector.selectedKeys(); Iterator it = Keys.iterator(); while (it.hasNext()) { SelectionKey key = null; key = (SelectionKey) it.next(); // 键为位掩码 it.remove(); // 客户端请求连接事件 if (key.isValid() && key.isWritable()) { log.info("Server: SelectionKey is acceptable."); handler.handleWrite(key); } if (key.isReadable()) {// 获得了可读的事件 log.info("Server: SelectionKey is readable."); handler.receiveMsg(key, receiver); } } Keys.clear(); } } catch (IOException e) { e.printStackTrace(); } } public static class ClientData { public SocketAddress clientAddress; public ByteBuffer buffer = ByteBuffer.allocate(255); } } package com.gateway.socket; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.DatagramChannel; import java.nio.channels.SelectionKey; import org.apache.log4j.Logger; import com.gateway.common.DeviceDataTools; import com.gateway.common.data.HexUtils; import com.gateway.socket.UDPEchoServerSelector.ClientData; /** * * 处理socket类 * * @author Andy * */ public class UDPSocketHandler { private static Logger log = Logger.getLogger(UDPSocketHandler.class); /** * 链接请求 * * @throws IOException */ public void handleWrite(SelectionKey key) { try { DatagramChannel channel = (DatagramChannel) key.channel(); ClientData clntDat = (ClientData) key.attachment(); clntDat.buffer.flip(); // 从起始位置开始发送 int bytesSent; bytesSent = channel.send(clntDat.buffer, clntDat.clientAddress); if (bytesSent != 0) { key.interestOps(SelectionKey.OP_READ); // 关注客户端发送数据 } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 读请求 * * @throws IOException */ public void receiveMsg(SelectionKey key, SocketReceiver receiver) { ByteBuffer byteBuffer = ByteBuffer.allocate(1024); byteBuffer.clear(); DatagramChannel socketChannel = (DatagramChannel) key.channel(); //非阻塞 try { socketChannel.configureBlocking(false); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } System.out.println("channel code:" + socketChannel.hashCode()); try { while (true) { InetSocketAddress client = (InetSocketAddress) socketChannel .receive(byteBuffer); byteBuffer.flip(); // byteBuffer中传过来的是10进制的bytep[] byte[] dst = new byte[byteBuffer.limit()]; byteBuffer.get(dst); // 将10进制的byte[]转化成16进制字符串 String data = HexUtils.converBytesToHex(dst); System.out.println(data); log.info("Server: data1 = " + data); byteBuffer.clear(); receiver.udpreceive(socketChannel, data, client); break; } } catch (java.io.IOException e) { //e.printStackTrace(); //this.closeChannel(key, socketChannel); } catch (Exception e) { //e.printStackTrace(); //this.closeChannel(key, socketChannel); } } /** * * @param socketChannel */ private void closeChannel(SelectionKey key, DatagramChannel socketChannel) { try { while (socketChannel.isOpen()) { key.cancel(); socketChannel.close(); } } catch (IOException e1) { e1.printStackTrace(); } } /** * 根据socketKey从内存中获取channel,通过channel向client端发送消息 * * @param socketKey * 内存在channel对应的key * @param data * 发送的数据 * @return * @throws IOException */ public static boolean send(String socketKey, String data) throws IOException { DatagramChannel socketChannel = SocketChannelMapper .getUDPChannel(socketKey); if (socketChannel == null || !socketChannel.isOpen()) { return false; } InetSocketAddress client = SocketChannelMapper .getUDPInetSocketAddress(socketKey + "address"); boolean f = socketChannel.isConnected(); ByteBuffer byteBuffer = ByteBuffer.wrap(DeviceDataTools.hex2Byte(data)); if (f) { socketChannel.write(byteBuffer); } else { socketChannel.connect(new InetSocketAddress(client.getAddress(), client.getPort())); socketChannel.send(byteBuffer, client); } return true; } /** * 根据socketKey从内存中获取channel,通过channel向client端发送消息 * * @param socketKey * 内存在channel对应的key * @param data * 发送的数据 * @return * @throws IOException */ public static boolean send(DatagramChannel socketChannel, String data, InetSocketAddress client) throws IOException { if (socketChannel == null) { return false; } System.out.println("#########################ADDRESS" + client.getAddress()); System.out.println("#########################PORT" + client.getPort()); boolean f = socketChannel.isConnected(); ByteBuffer byteBuffer = ByteBuffer.wrap(DeviceDataTools.hexStr2ByteArray(data)); if (f) { socketChannel.write(byteBuffer); } else { socketChannel.connect(new InetSocketAddress(client.getAddress(), client.getPort())); socketChannel.send(byteBuffer, client); } return true; } }
java nio通信问题如何解决
大佬们帮我看看这句代码,我有点理解不了:![图片说明](https://img-ask.csdn.net/upload/201706/02/1496365514_646261.png) 这句代码的前面是获取欲与服务器端建立联系的selectionkey的作用,但是server.accept()这句代码并没有和相应的selectionkey对应,jdk只是说这句代码的作用只是获取此刻与服务器channel建立连接的socketchannel而不是此刻正在被检查的selectionkey的对应的socketchannel,那前面的那句sk.isAccpetable()不就起不到作用了吗?请知道的大侠告诉下。代码如下: public class NServer { //用于检测所有Channel状态的Selector private Selector selector=null; static final int PORT=3334; //定义实现编码、解码的字符集对象 private Charset charset=Charset.forName("UTF-8"); public void init() { try { selector=Selector.open(); //通过open方法来打开一个未绑定的ServerSocketChannel实例 ServerSocketChannel server=ServerSocketChannel.open(); InetSocketAddress isa=new InetSocketAddress("127.0.0.1",PORT); //将该ServerSocketChannel绑定到指定IP地址 server.bind(isa); //设置ServerSocket以非阻塞方式工作 server.configureBlocking(false); //将server注册到指定的Selector对象 server.register(selector,SelectionKey.OP_ACCEPT); while(true) //说明有需要处理的IO对象 { if(selector.select()==0)continue; //依次处理selector上的每个选择的SelectionKey for(SelectionKey sk :selector.selectedKeys()) { //从selector上的已选择Key集中删除正在处理的SelectionKey selector.selectedKeys().remove(sk); //如果sk对应的Channel包含客户端的连接请求 if(sk.isAcceptable()) { //调用accept方法接受连接,产生服务端的SocketChannel SocketChannel sc=server.accept(); //设置采用非阻塞模式 if (sc == null) { continue; } sc.configureBlocking(false); //将该SocketChannel也注册到selector //后面的read表示我们可以向通道那里读入数据了 // System.out.println("@@@@@@@@@@@@"); sc.register(selector, SelectionKey.OP_READ); //将sk对应的Channel设置成准备接收其他请求 //sk.interestOps(SelectionKey.OP_ACCEPT); } //如果sk对应的Channel有数据需要读取 if(sk.isReadable()) { //System.out.println("@@@@@@@@@@@@"); //获取该SelectionKey对应的Channel,该Channel中有可读的数据 SocketChannel sc=(SocketChannel) sk.channel(); //定义准备执行读取数据的ByteBuffer ByteBuffer buff=ByteBuffer.allocate(1024); String content=""; //开始读取数据 try { while(sc.read(buff)>0) { buff.flip(); content+=charset.decode(buff); } //打印从该sk对应的Channel里读取到的数据 while(sc.write(buff)>0) { buff.clear(); content+=charset.decode(buff); } //将sk对应的Channel设置成准备下一次读取 sk.interestOps(SelectionKey.OP_READ); System.out.println("Server收到信息了: "+content); if(content.length()<5) { sc.write(charset.encode("你发过来的长度小于5")); } else if(content.length()<9) { sc.write(charset.encode("你发过来的长度小于9")); } }catch(IOException ex) { //从Selector中删除指定的SelectionKey sk.cancel(); if(sk.channel()!=null) { sk.channel().close(); } } //sc.write(charset.encode(line)); } } } } catch (IOException e) { // TODO 自动生成的 catch 块 //System.out.println("出错了"); e.printStackTrace(); } } class Thread3 extends Thread { public void run() { init(); System.out.println("结束了"); } } public static void main(String[]args) { new NServer().new Thread3().start(); } }
netty客户端向远程服务端发送数据包
首先,感谢每一位来关注的IT前辈,真诚希望您提出宝贵的意见。 我需要的效果: 1.客户端与服务端长连接TCP通信; 2.客户端通过自定义解码器,解析服务端返回的数据包; 3.客户端在服务端返回连接结果后,发送登录请求数据包,需要对数据自定义编码器解析; 4.因为是长连接,服务不能断,还需要发送登陆请求,以及其他验证消息。很重要。 **数据包结构:** 1.固定包头2字节; 2.消息体,全部为文本(ASCII码),汉字是GB2312编码。 3.固定包尾2字节; 我目前代码: public class TCPClient { public void connect(int port,String host)throws Exception{ //网络事件处理线程组 EventLoopGroup group=new NioEventLoopGroup(); //配置客户端启动类 Bootstrap b=new Bootstrap(); b.group(group).channel(NioSocketChannel.class) .option(ChannelOption.TCP_NODELAY, true)//设置封包 使用一次 大数据的写操作,而不是多次小数据的写操作 .handler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast("decoder",new DealMsg()); //设置自定义解码器 ch.pipeline().addLast("encoder",new MsgEncode()); //设置自定义编码器 ch.pipeline().addLast(new TCPClientHandler()); //设置客户端网络IO处理器 } }); //连接服务器 同步等待成功 ChannelFuture f = b.connect(new InetSocketAddress(host,port)); //同步等待客户端通道关闭 // f.channel().closeFuture().sync(); //不关闭会发生阻塞 Channel channel = f.sync().channel(); Scanner scanner = new Scanner(System.in); while(true){ System.out.println("请输入"); CarData carData = new CarData(); String line = scanner.nextLine(); carData.setBody(line); //发送请求 channel.writeAndFlush(carData); } //释放线程组资源 // group.shutdownGracefully(); } } public class TCPClientHandler extends ChannelHandlerAdapter { @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { System.out.println("通信异常!!"); cause.printStackTrace(); } @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { System.out.println("链接服务端成功!"); } @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { System.out.println("退出链接!!"); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { System.out.println("接受服务器数据:【 "+msg); } @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { ctx.channel().writeAndFlush("数据读取完成!"); } }
java nio为什么会在Selector.select()函数一直等待
``` while (true) { // 选择一组键 selector.select(); // 返回此选择器的已选择键集 Set<SelectionKey> selectionKeys = selector.selectedKeys(); Iterator<SelectionKey> iterator = selectionKeys.iterator(); // 遍历对应的 SelectionKey 处理 while (iterator.hasNext()) { SelectionKey selectionKey = (SelectionKey) iterator.next(); iterator.remove(); if(!selectionKey.isValid()){ continue; } // 判断此键的通道是否已完成其套接字连接操作 if (selectionKey.isConnectable()) { connected(selectionKey); } // 判断是否连接可读操作 else if (selectionKey.isReadable()) { readMessage(selectionKey); } // 判断是否连接可写操作 else if (selectionKey.isWritable()) { writeMessage(selectionKey); } } selectionKeys.clear(); } ``` ``` private void connected(SelectionKey selectionKey) throws IOException { SocketChannel client = (SocketChannel) selectionKey.channel(); // 判断该通道是否进行连接过程、完成连接过程 if (client.isConnectionPending()) { if (client.finishConnect()) { client.write("hello"); // 将数据写入该通道 client.register(selector, SelectionKey.OP_READ); } } } ``` 代码如上,为什么每次,执行connected(SelectionKey selectionKey) 过后循环到selector.select();后就一直等待?
Android:Socket output is shutdown
``` SocketChannel socketChannel; ByteBuffer sendBuffer; //省略连接部分代码....但确保socketChannel已经和服务器socket连接上了 sendBuffer = ByteBuffer.wrap("hello".getBytes("UTF8")); socketChannel.write(sendBuffer); ``` 最后一行抛出异常java.net.SocketException: Socket output is shutdown
java中for循环没有跳出
大家好,下面的代码中Cal.size()是1,for循环应该只执行一次,但是有时却执行了多次,System.out.println("H是:"+h);打印多次都是0,循环没有跳出,很奇怪,不明白是什么问题,以下是完整代码,三个for循环是同样的问题 //每五秒钟自动遍历一次数据库,将策略数据发送至指定集中控制器 Runnable send = new Runnable() { @Override public void run() { Mysend: //for无限循环 for(;;) { try{ //byte[] cllx={1,2,3}; Convertion con=new Convertion(); gettacticsdata data=new gettacticsdata(); //读取存储在Map中已登录用户ID Map<String, SocketChannel> map = Mymap.getChannels(); Iterator<String> it = map.keySet().iterator(); while (it.hasNext()) { String key = it.next(); SocketChannel obj = map.get(key); //判断当前客户是否在线,如果在线就传数据,不在就删除存储在Map中的登录信息 if(obj.isActive()==true) { //查询需要下发的策略B数据 ArrayList Bal = new ArrayList(); Bal=data.GetBdata(key); //判断是否有需要下发的策略 if(Bal.size()>0) { for(int i=0;i<Bal.size();i++) { System.out.println("I是:"+i); tacticsBdata Bl=(tacticsBdata) Bal.get(i); byte[] Bdata=con.GetBdata(Bl); //SocketChannel obj = map.get(key); if(Bdata.length==32) { ByteBuf Bsend =Unpooled.copiedBuffer(Bdata); obj.writeAndFlush(Bsend); } } } //查询需要下发的策略C数据 ArrayList Cal = new ArrayList(); Cal=data.GetCdata(key); //判断是否有需要下发的策略 if(Cal.size()>0) { for(int h=0;h<Cal.size();h++) { System.out.println("H是:"+h); tacticsCdata Cl=(tacticsCdata) Cal.get(h); byte[] Cdata=con.GetCdata(Cl); //SocketChannel obj = map.get(key); if(Cdata.length==18){ ByteBuf Csend =Unpooled.copiedBuffer(Cdata); obj.writeAndFlush(Csend); } } } //查询需要下发的策略A数据 ArrayList Aal = new ArrayList(); Aal=data.GetAdata(key); //判断是否有需要下发的策略 if(Aal.size()>0) { for(int j=0;j<Aal.size();j++) { System.out.println("J是:"+j); tacticsAdata Al=(tacticsAdata) Aal.get(j); byte[] Adata=con.GetAdata(Al); if(Adata.length==14){ ByteBuf Asend =Unpooled.copiedBuffer(Adata); obj.writeAndFlush(Asend); } } } }else { System.out.println("此ChannelID已掉线: " + obj); map.remove(key); obj.close(); } } } catch(Exception e) { break Mysend; } try { //线程休眠10秒钟后再次启动 Thread.sleep(10000); } catch (InterruptedException e) { //e.printStackTrace(); } } } }; new Thread(send).start();
eclipse启动动态项目run on server,tomcat起不来
小白一枚,跪求大神解答,eclipse启动动态项目run on server,tomcat起不来,请问这个情况如何解决 控制台信息如下: 十二月 04, 2019 10:34:27 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Server.服务器版本: Apache Tomcat/9.0.19 十二月 04, 2019 10:34:27 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Server.构建: Apr 12 2019 14:22:48 UTC 十二月 04, 2019 10:34:27 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Server version number: 9.0.19.0 十二月 04, 2019 10:34:27 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: OS Name: Windows 7 十二月 04, 2019 10:34:27 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: OS.版本: 6.1 十二月 04, 2019 10:34:27 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: 结.造: amd64 十二月 04, 2019 10:34:27 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Java 环境变量: C:\Program Files\Java\jre1.8.0_73 十二月 04, 2019 10:34:27 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: JVM 版本: 1.8.0_73-b02 十二月 04, 2019 10:34:27 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: JVM.供应商: Oracle Corporation 十二月 04, 2019 10:34:27 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: CATALINA_BASE: E:\workspace\program\.metadata\.plugins\org.eclipse.wst.server.core\tmp1 十二月 04, 2019 10:34:27 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: CATALINA_HOME: D:\apache-tomcat-9.0.19 十二月 04, 2019 10:34:27 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -Dcatalina.base=E:\workspace\program\.metadata\.plugins\org.eclipse.wst.server.core\tmp1 十二月 04, 2019 10:34:27 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -Dcatalina.home=D:\apache-tomcat-9.0.19 十二月 04, 2019 10:34:27 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -Dwtp.deploy=E:\workspace\program\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps 十二月 04, 2019 10:34:27 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -Djava.endorsed.dirs=D:\apache-tomcat-9.0.19\endorsed 十二月 04, 2019 10:34:27 下午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -Dfile.encoding=GBK 十二月 04, 2019 10:34:27 下午 org.apache.catalina.core.AprLifecycleListener lifecycleEvent 信息: Loaded APR based Apache Tomcat Native library [1.2.21] using APR version [1.6.5]. 十二月 04, 2019 10:34:27 下午 org.apache.catalina.core.AprLifecycleListener lifecycleEvent 信息: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true]. 十二月 04, 2019 10:34:27 下午 org.apache.catalina.core.AprLifecycleListener lifecycleEvent 信息: APR/OpenSSL configuration: useAprConnector [false], useOpenSSL [true] 十二月 04, 2019 10:34:27 下午 org.apache.catalina.core.AprLifecycleListener initializeSSL 信息: OpenSSL successfully initialized [OpenSSL 1.1.1a 20 Nov 2018] 十二月 04, 2019 10:34:28 下午 org.apache.coyote.AbstractProtocol init 信息: 初始化协议处理器 ["http-nio-8080"] 十二月 04, 2019 10:35:10 下午 org.apache.catalina.util.LifecycleBase handleSubClassException 严重: 初始化组件[Connector[HTTP/1.1-8080]]失败。 org.apache.catalina.LifecycleException: Protocol handler initialization failed at org.apache.catalina.connector.Connector.initInternal(Connector.java:983) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136) at org.apache.catalina.core.StandardService.initInternal(StandardService.java:535) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136) at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:1059) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136) at org.apache.catalina.startup.Catalina.load(Catalina.java:584) at org.apache.catalina.startup.Catalina.load(Catalina.java:607) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:306) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:491) Caused by: java.io.IOException: Unable to establish loopback connection at sun.nio.ch.PipeImpl$Initializer.run(Unknown Source) at sun.nio.ch.PipeImpl$Initializer.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at sun.nio.ch.PipeImpl.<init>(Unknown Source) at sun.nio.ch.SelectorProviderImpl.openPipe(Unknown Source) at java.nio.channels.Pipe.open(Unknown Source) at sun.nio.ch.WindowsSelectorImpl.<init>(Unknown Source) at sun.nio.ch.WindowsSelectorProvider.openSelector(Unknown Source) at java.nio.channels.Selector.open(Unknown Source) at org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector(NioSelectorPool.java:54) at org.apache.tomcat.util.net.NioSelectorPool.close(NioSelectorPool.java:109) at org.apache.tomcat.util.net.NioEndpoint.unbind(NioEndpoint.java:341) at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1121) at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1129) at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:557) at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:74) at org.apache.catalina.connector.Connector.initInternal(Connector.java:980) ... 13 more Caused by: java.net.ConnectException: Connection timed out: connect at sun.nio.ch.Net.connect0(Native Method) at sun.nio.ch.Net.connect(Unknown Source) at sun.nio.ch.Net.connect(Unknown Source) at sun.nio.ch.SocketChannelImpl.connect(Unknown Source) at java.nio.channels.SocketChannel.open(Unknown Source) at sun.nio.ch.PipeImpl$Initializer$LoopbackConnector.run(Unknown Source) ... 30 more 十二月 04, 2019 10:35:10 下午 org.apache.coyote.AbstractProtocol init 信息: 初始化协议处理器 ["ajp-nio-8009"] 十二月 04, 2019 10:35:52 下午 org.apache.catalina.util.LifecycleBase handleSubClassException 严重: 初始化组件[Connector[AJP/1.3-8009]]失败。 org.apache.catalina.LifecycleException: Protocol handler initialization failed at org.apache.catalina.connector.Connector.initInternal(Connector.java:983) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136) at org.apache.catalina.core.StandardService.initInternal(StandardService.java:535) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136) at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:1059) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136) at org.apache.catalina.startup.Catalina.load(Catalina.java:584) at org.apache.catalina.startup.Catalina.load(Catalina.java:607) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:306) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:491) Caused by: java.io.IOException: Unable to establish loopback connection at sun.nio.ch.PipeImpl$Initializer.run(Unknown Source) at sun.nio.ch.PipeImpl$Initializer.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at sun.nio.ch.PipeImpl.<init>(Unknown Source) at sun.nio.ch.SelectorProviderImpl.openPipe(Unknown Source) at java.nio.channels.Pipe.open(Unknown Source) at sun.nio.ch.WindowsSelectorImpl.<init>(Unknown Source) at sun.nio.ch.WindowsSelectorProvider.openSelector(Unknown Source) at java.nio.channels.Selector.open(Unknown Source) at org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector(NioSelectorPool.java:54) at org.apache.tomcat.util.net.NioSelectorPool.close(NioSelectorPool.java:109) at org.apache.tomcat.util.net.NioEndpoint.unbind(NioEndpoint.java:341) at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1121) at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1129) at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:557) at org.apache.catalina.connector.Connector.initInternal(Connector.java:980) ... 13 more Caused by: java.net.ConnectException: Connection timed out: connect at sun.nio.ch.Net.connect0(Native Method) at sun.nio.ch.Net.connect(Unknown Source) at sun.nio.ch.Net.connect(Unknown Source) at sun.nio.ch.SocketChannelImpl.connect(Unknown Source) at java.nio.channels.SocketChannel.open(Unknown Source) at sun.nio.ch.PipeImpl$Initializer$LoopbackConnector.run(Unknown Source) ... 29 more 十二月 04, 2019 10:35:52 下午 org.apache.catalina.startup.Catalina load 信息: 服务器在[85,235]毫秒内初始化 十二月 04, 2019 10:35:52 下午 org.apache.catalina.core.StandardService startInternal 信息: Starting service [Catalina] 十二月 04, 2019 10:35:52 下午 org.apache.catalina.core.StandardEngine startInternal 信息: Starting Servlet engine: [Apache Tomcat/9.0.19] 十二月 04, 2019 10:35:53 下午 org.apache.catalina.util.SessionIdGeneratorBase createSecureRandom 警告: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [557] milliseconds. 十二月 04, 2019 10:35:53 下午 org.apache.jasper.servlet.TldScanner scanJars 信息: 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。 十二月 04, 2019 10:35:53 下午 org.apache.catalina.startup.Catalina start 信息: Server startup in [1,428] milliseconds
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。 补充 有不少读者留言说本文章没有用,因为天气预报直接打开手机就可以收到了,为何要多此一举发送到邮箱呢!!!那我在这里只能说:因为你没用,所以你没用!!! 这里主要介绍的是思路,不是天气预报!不是天气预报!!不是天气预报!!!天气预报只是用于举例。请各位不要再刚了!!! 下面是我会用到的两个场景: 每日下
面试官问我:什么是消息队列?什么场景需要他?用了会出现什么问题?
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
MyBatis研习录(01)——MyBatis概述与入门
C语言自学完备手册(33篇) Android多分辨率适配框架 JavaWeb核心技术系列教程 HTML5前端开发实战系列教程 MySQL数据库实操教程(35篇图文版) 推翻自己和过往——自定义View系列教程(10篇) 走出思维困境,踏上精进之路——Android开发进阶精华录 讲给Android程序员看的前端系列教程(40集免费视频教程+源码) 版权声明 本文原创作者:谷哥的小弟 作者博客
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 前前言 为啥今天有个前前言呢? 因为你们的丙丙啊,昨天有牌面了哟,直接被微信官方推荐,知乎推荐,也就仅仅是还行吧(心里乐开花)
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
Python爬虫精简步骤1 获取数据
爬虫的工作分为四步: 1.获取数据。爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据。 2.解析数据。爬虫程序会把服务器返回的数据解析成我们能读懂的格式。 3.提取数据。爬虫程序再从中提取出我们需要的数据。 4.储存数据。爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。 这一篇的内容就是:获取数据。 首先,我们将会利用一个强大的库——requests来获取数据。 在电脑上安装
Python绘图,圣诞树,花,爱心 | Turtle篇
1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle() circle.shape('circle') circle.color('red') circle.speed('fastest') circle.up() square = turtle.Turtle()
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 更多有趣分析教程,扫描下方二维码关注vx公号「裸睡的猪」 即可查看! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布
web前端javascript+jquery知识点总结
Javascript javascript 在前端网页中占有非常重要的地位,可以用于验证表单,制作特效等功能,它是一种描述语言,也是一种基于对象(Object)和事件驱动并具有安全性的脚本语言 ,语法同java类似,是一种解释性语言,边执行边解释。 JavaScript的组成: ECMAScipt 用于描述: 语法,变量和数据类型,运算符,逻辑控制语句,关键字保留字,对象。 浏览器对象模型(Br
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
文章目录1. 前言2. 数据下载3. 数据处理4. 数据可视化 1. 前言 今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。 2月6日追记:本文发布后,腾讯的数据源多次变更u
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
渗透测试-灰鸽子远控木马
木马概述 灰鸽子( Huigezi),原本该软件适用于公司和家庭管理,其功能十分强大,不但能监视摄像头、键盘记录、监控桌面、文件操作等。还提供了黑客专用功能,如:伪装系统图标、随意更换启动项名称和表述、随意更换端口、运行后自删除、毫无提示安装等,并采用反弹链接这种缺陷设计,使得使用者拥有最高权限,一经破解即无法控制。最终导致被黑客恶意使用。原作者的灰鸽子被定义为是一款集多种控制方式于一体的木马程序
Python:爬取疫情每日数据
前言 有部分同学留言说为什么412,这是因为我代码里全国的cookies需要你自己打开浏览器更新好后替换,而且这个cookies大概只能持续20秒左右! 另外全国卫健委的数据格式一直在变,也有可能会导致爬取失败! 我现在已根据2月14日最新通报稿的格式修正了! 目前每天各大平台,如腾讯、今日头条都会更新疫情每日数据,他们的数据源都是一样的,主要都是通过各地的卫健委官网通报。 为什么已经有大量平台做
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。   再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。   下文是原回答,希望能对你能有所启发。   如果我说,这个世界上人真的分三六九等,
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计
Python新型冠状病毒疫情数据自动爬取+统计+发送报告+数据屏幕(三)发送篇
今天介绍的项目是使用 Itchat 发送统计报告 项目功能设计: 定时爬取疫情数据存入Mysql 进行数据分析制作疫情报告 使用itchat给亲人朋友发送分析报告(本文) 基于Django做数据屏幕 使用Tableau做数据分析 来看看最终效果 目前已经完成,预计2月12日前更新 使用 itchat 发送数据统计报告 itchat 是一个基于 web微信的一个框架,但微信官方并不允
作为程序员的我,大学四年一直自学,全靠这些实用工具和学习网站!
我本人因为高中沉迷于爱情,导致学业荒废,后来高考,毫无疑问进入了一所普普通通的大学,实在惭愧...... 我又是那么好强,现在学历不行,没办法改变的事情了,所以,进入大学开始,我就下定决心,一定要让自己掌握更多的技能,尤其选择了计算机这个行业,一定要多学习技术。 在进入大学学习不久后,我就认清了一个现实:我这个大学的整体教学质量和学习风气,真的一言难尽,懂的人自然知道怎么回事? 怎么办?我该如何更好的提升
粒子群算法求解物流配送路线问题(python)
粒子群算法求解物流配送路线问题(python) 1.查找论文文献 找一篇物流配送路径优化+粒子群算法求解的论文 参考文献:基于混沌粒子群算法的物流配送路径优化 2.了解粒子群算法的原理 讲解通俗易懂,有数学实例的博文:https://blog.csdn.net/daaikuaichuan/article/details/81382794 3.确定编码方式和解码策略 3.1编码方式 物流配送路线的
教你如何编写第一个简单的爬虫
很多人知道爬虫,也很想利用爬虫去爬取自己想要的数据,那么爬虫到底怎么用呢?今天就教大家编写一个简单的爬虫。 下面以爬取笔者的个人博客网站为例获取第一篇文章的标题名称,教大家学会一个简单的爬虫。 第一步:获取页面 #!/usr/bin/python # coding: utf-8 import requests #引入包requests link = "http://www.santostang.
前端JS初级面试题二 (。•ˇ‸ˇ•。)老铁们!快来瞧瞧自己都会了么
1. 传统事件绑定和符合W3C标准的事件绑定有什么区别? 传统事件绑定 &lt;div onclick=""&gt;123&lt;/div&gt; div1.onclick = function(){}; &lt;button onmouseover=""&gt;&lt;/button&gt; 注意: 如果给同一个元素绑定了两次或多次相同类型的事件,那么后面的绑定会覆盖前面的绑定 (不支持DOM事...
相关热词 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数 c#日期精确到分钟 c#自定义异常必须继承 c#查表并返回值 c# 动态 表达式树 c# 监控方法耗时 c# listbox c#chart显示滚动条
立即提问