关于io流的read方法阻塞的问题

本人因为业务需求,需要频繁的调用FileInputStream中的read()方法从硬件中获取数据,
因为read()方法是阻塞的,如果硬件一直没有数据发过来的话,read()方法会一直阻塞,这个方法我单独放在了一个子线程当中。
但是业务要求在退出时候要释放所有资源,方便第二次启动程序重新连接硬件。但是我在主线程中无法终止这个read()方法。我在read()之前增加了available()进行判断,想将其在有数据的情况下才去调用read()方法,可是系统又报错说ioctl failed: EINVAL。我将FileInputStream换成了FileChannel,调用它的read()方法,想在主线程中关闭通道让其抛出异常,但是主线程中关闭通道子线程仍没有反应。我不知道错误出现在什么地方。不知道哪位大神有好办法解决这个问题!!!!!!!

1个回答

qq_35881076
qq_35881076 您好,首先十分感谢您能回复我!看了您给的链接,自己按链接上的试了试,结果不怎么理想。我的输入流的read方法还是会一直阻塞,或者就收不到数据。您是否还有其他的解决办法?十分感谢!
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java io流read()的问题

![图片说明](https://img-ask.csdn.net/upload/201608/08/1470641819_816489.png) 在这个方法中 fis.read(buffer); 我看API中read()的描述是这样的“从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。”。如果是这样的话那数据不是已经储存到byte[]数组中了吗?不是可以直接执行for循环了吗,为什么还要用到输出流啊。 菜鸟不懂啊,求大神指导。。。

lua io.read("*number") 失效,致使全部程序无法运行

在编写代码时用到了io.read("_*number")想获取一个数字, 但是加入这个语句之后发现整个程序可以编译,但是控制台没有任何输出信息, io.read()上面的所有语句也无法执行 具体代码如下: ``` print("请输入阶层数") --我在这里加了个输出测试,发现也无法打印出来 function Way( n ) resultAll={}; tempArr1={""}; resultAll[1]=tempArr1;--当楼梯数为1时,步法为空 tempArr2={"1"}; resultAll[2]=tempArr2;--当楼梯数为2时,步法为1 for i=3,n+1 do--当楼梯数大于3时,剩余的步法还有n+1-3种 resultAll[i]={} --为每一种步法建立一个table -- 为每一种步法填上相应步法数据 for j=1,table.getn(resultAll[i-1]) do table.insert(resultAll[i],resultAll[i-1][j].."1"); end for j=1,table.getn(resultAll[i-2]) do table.insert(resultAll[i],resultAll[i-2][j].."2") end end for i=1,table.getn(resultAll[n+1]) do print(resultAll[n+1][i]) end end print("请输入阶层数") n=io.read("*number") --经过测试,问题就出在这一句! io.write(Way(n)) ``` 控制台输出如下![图片说明](https://img-ask.csdn.net/upload/201708/17/1502934742_703198.png) 尝试输入数字测试:![图片说明](https://img-ask.csdn.net/upload/201708/17/1502934883_69340.png) 这是我将出问题的地方简化后的代码: io.write("你好") n=io.read("*n") print(n) 依旧是没有反应 io.write("你好") io.flush() --加入这一句之后发现"你好能输出来",但是后面的依旧没有反应 n=io.read("*n") print(n) 补充:环境是LuaForWindows_v5.1.4-46 w7 sublimetext3

如何理解java中的阻塞IO

求高手帮我分析下面这一段话到底如何理解? JDK中明确说明了read,write都是阻塞方法,但是没有实例支撑,无法理解为什么是这样的。 ![图片说明](https://img-ask.csdn.net/upload/201701/16/1484538847_347660.jpg) 求高手给个明白的实例,让我理解上面这段话的意思

网络编程中阻塞式IO的真正含义到底是什么

这两天在看socket编程,可以说这方面是个新手,其中看到了nio,网上有很多文章介绍了nio相对于多线程处理网络链接(每建立一个socket链接,服务器便会开启一个线程来对此socket单独处理和客户端的通信)的优点。因为nio是事件驱动,不会发生Socket读取流数据时的阻塞。我想问的是这里所说的读取流数据的阻塞是我们平时所说的线程进入阻塞态吗? 当一个线程单独处理一个客户端请求时,它需要等待客户端向它的输出流写入数据,完后服务器端处理此socket的线程才能读取数据,如果客户端未写入数据,那么服务器端线程便会一直停留在对流的读取状态,即调用流的read()方法,我感到疑惑的是当客户端未写入数据而服务器端正在进入read()读取数据时,服务器端处理的这个线程是由运行态进入阻塞态了还是说一直在read()方法循环检测流中的数据(这样的话线程仍然在运行态),网上的很多表达让我对它们产生了很大的疑惑,关于网络中流的读取写入本人还是个新手,这可能涉及到更底层的一些东西,希望有人能够给指点一下。 我也看了java的源码,当流读取时,是进入一个 for(;;)的死循环。所以我认为是这个线程并没有进入阻塞态,而是一直循环在检测输入流的数据,一旦有数据便会从read()返回,不知道理解的对还是不对? 以下是服务器端的代码: [code="java"] import java.io.*; import java.net.*; public class Server{ public static void main(String args[]) { ServerSocket server=null; try{ server=new ServerSocket(4700); //创建一个ServerSocket在端口4700监听客户请求(已经建立监听) }catch(Exception e) { System.out.println("can not listen to:"+e); //出错,打印出错信息 } Socket socket=null; try{ while(true){ socket=server.accept(); //使用accept()阻塞等待客户请求, //请求到来则产生一个Socket对象,并继续执行 Thread t = new Thread(new Processor(socket)); t.start(); } }catch(Exception e) { System.out.println("Error."+e); } } } class Processor implements Runnable{ private Socket socket; public Processor(Socket socket){ this.socket = socket; } public void run() { try{ String line; BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream())); //由Socket对象得到输入流,并构造相应的BufferedReader对象 PrintWriter os=new PrintWriter(socket.getOutputStream()); //由Socket对象得到输出流,并构造PrintWriter对象 BufferedReader sin=new BufferedReader(new InputStreamReader(System.in)); //由系统标准输入设备构造BufferedReader对象 System.out.println("Client:"+is.readLine()); //在标准输出上打印从客户端读入的字符串 line=sin.readLine(); //从标准输入读入一字符串 while(!line.equals("bye")){ //如果该字符串为 "bye",则停止循环 os.println(line); //向客户端输出该字符串 os.flush(); //刷新输出流,使Client马上收到该字符串 System.out.println("Server:"+line); //在系统标准输出上打印读入的字符串 System.out.println("Client:"+is.readLine()); //从Client读入一字符串,并打印到标准输出上 line=sin.readLine(); //从系统标准输入读入一字符串 } //继续循环 os.close(); //关闭Socket输出流 is.close(); //关闭Socket输入流 socket.close(); //关闭Socket }catch(Exception e){ e.printStackTrace(); } } }[/code]

IO流 读取缓存区内容写到数组里面 返回值为0是什么情况

当我在客户端输入一个数据后,服务器端就会不停的循环接收空字节的内容 ![图片说明](https://img-ask.csdn.net/upload/202004/12/1586694626_103888.png) 只有当我把服务器端while循环的条件改为>0时这种问题才会解决![图片说明](https://img-ask.csdn.net/upload/202004/12/1586694507_741007.png) 想问问各位大佬这是为什么,还有返回值为0时是什么情况 试了把空字符发送给服务器端 在while ((len = sChannel.read(buf)) != -1)情况下不能发送 代码如下 希望有大佬可以帮我解决下 ``` import org.junit.Test; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.util.Iterator; import java.util.Scanner; public class TestNoneBlocingNIO { @Test public void client() throws IOException { //建立通道 SocketChannel sChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 3366)); //切换为非阻塞模式 sChannel.configureBlocking(false); //创建缓存区 ByteBuffer buf = ByteBuffer.allocate(1024); //发送数据到服务器 Scanner scanner = new Scanner(System.in); System.out.println("请输入"); while (scanner.hasNext()){ String str = scanner.next(); buf.put((new Date().toString() + str).getBytes()); buf.flip(); sChannel.write(buf); buf.clear(); } //关闭通道 sChannel.close(); } @Test public void Server() throws IOException { //获取通道 ServerSocketChannel ssChannel = ServerSocketChannel.open(); //切换为非阻塞模式 ssChannel.configureBlocking(false); //绑定连接 ssChannel.bind(new InetSocketAddress(3366)); //获取选择器 Selector selector = Selector.open(); //将通道注册到选择器上 ssChannel.register(selector, SelectionKey.OP_ACCEPT); //轮训式的获取选择器上已经“准备就绪”的事件 while (selector.select() > 0){ //获取当前选择器中所有注册的“选择键(已经就绪的监听事件)” Iterator<SelectionKey> iterator = selector.selectedKeys().iterator(); while (iterator.hasNext()){ //获取“准备就绪的事件” SelectionKey sk = iterator.next(); //判断是什么事件 if(sk.isAcceptable()){//获取点前选择器上“接收就绪”状态的通道 //获取客户端连接 SocketChannel sChannel = ssChannel.accept(); //切换为非阻塞模式 sChannel.configureBlocking(false); //将该通道注册到选择器上 sChannel.register(selector, SelectionKey.OP_READ); }else if (sk.isReadable()){//获取点前选择器上“读就绪”状态的通道 SocketChannel sChannel = (SocketChannel) sk.channel(); //读取数据 ByteBuffer buf = ByteBuffer.allocate(1024); int len; while ((len = sChannel.read(buf)) != -1){ buf.flip(); System.out.println("字节长度" + len); System.out.println("内容为"+ new String(buf.array(),0,len)); buf.clear(); } } //取消选择键 iterator.remove(); } } } } ```

尝试在Golang中使用io.CopyN()读取时客户端卡住了

<div class="post-text" itemprop="text"> <p>I am trying to make TCP server for transferring files. I am suing io.CopyN for reading and writing. From server side, I am sending files to client so from server side, it sends perfectly all bytes but Client side after reading a couple of 1000000 bytes it stuck. sometimes it works fine and sometimes it gets stuck. I am using 300 MB pdf to test. Any help, code, and output is like below.</p> <h1>server</h1> <pre><code> package main import ( "fmt" "io" "log" "net" "os" "strconv" "strings" ) func main() { ls, err := net.Listen("tcp", ":1234") errFunc(err) defer ls.Close() conn, _ := ls.Accept() defer conn.Close() for { file, err := os.Open(strings.TrimSpace("./" + "Mag" + ".pdf")) errFunc(err) defer file.Close() fileInfo, err := file.Stat() errFunc(err) size := fileInfo.Size() numberOfTime := size / 1000000 leftByte := size - numberOfTime*1000000 numberOfTimeString := strconv.Itoa(int(numberOfTime)) leftByteString := strconv.Itoa(int(leftByte)) fmt.Println("1000000 times : ", numberOfTimeString) fmt.Println("Left Bytes : ", leftByteString) _, err = fmt.Fprintf(conn, numberOfTimeString+" ") errFunc(err) _, err = fmt.Fprintf(conn, leftByteString+" ") errFunc(err) fileWriter := io.Writer(conn) for i := 0; i &lt; int(numberOfTime); i++ { n, err := io.CopyN(conn, file, 1000000) if i &gt;= 30 { fmt.Println(err, n) } } n, err := io.CopyN(fileWriter, file, leftByte+1) if err == io.EOF { fmt.Println(err, n) } fmt.Printf("Succefully bytes sent : %v ", n) file.Close() } } func errFunc(err error) { if err != nil { log.Fatal(err) } } </code></pre> <h1>client</h1> <pre><code> package main import ( "bufio" "fmt" "io" "net" "os" "os/signal" "strconv" "strings" "syscall" ) func main() { c := make(chan os.Signal, 15) signal.Notify(c, syscall.SIGINT) go func() { for { s := &lt;-c switch s { case syscall.SIGINT: os.Exit(1) } } }() conn, _ := net.Dial("tcp", ":1234") defer conn.Close() connReadWrite := bufio.NewReader(io.Reader(conn)) var i int var filename string for { i++ nu := strconv.Itoa(i) filename = "image" + nu + ".pdf" file, err := os.Create(filename) defer file.Close() numberOfTimeString, err := connReadWrite.ReadString(' ') if err != nil { fmt.Println(err) } println("1000000 times :", numberOfTimeString) numberOfTimeString = strings.TrimSuffix(numberOfTimeString, " ") numberOfTime, err := strconv.Atoi(numberOfTimeString) if err != nil { fmt.Println(err) } leftByteString, err := connReadWrite.ReadString(' ') if err != nil { println(err) } println("Left Bytes :", leftByteString) leftByteString = strings.TrimSuffix(leftByteString, " ") leftByte, err := strconv.Atoi(leftByteString) if err != nil { panic(err) } fmt.Println("After convert in Num :", numberOfTime, leftByte) newFileWriter := io.Writer(file) newFileReader := io.Reader(conn) for i := 0; i &lt; numberOfTime; i++ { n, err := io.CopyN(newFileWriter, newFileReader, 1000000) if i &gt;= 30 { errFun(err, n) } } n, err := io.CopyN(newFileWriter, newFileReader, int64(leftByte)) errFun(err, n) fmt.Printf("sucessfully Transfered ---&gt; ") } } func errFun(err error, n int64) { if err == io.EOF { fmt.Println("End of file : ", n) return } else if n == 0 { fmt.Println("n is : ", n) return } else if err != nil { fmt.Println(err) return } fmt.Println(err, " : ", n) } </code></pre> <h1>input/output</h1> <p>from server side first we are sending number of bytes it need to readand then client side it gets a number of bytes it needs to read and then I am sending the file and then it read. In the picture, I was able to send one-time second time it got stuck sometimes it stuck first time too.I am able to send number of byte from server side second time too but as you can see it don't read that numeber, it read something "%PDF..." and it even don't print "100000 times : " correctly it prints "%???00 times :" I just don’t understand this</p> <p><a href="https://i.stack.imgur.com/Qcw2e.png" rel="nofollow noreferrer">enter image description here</a></p> </div>

tcp大文件传输,全部write成功,read接收到部分后阻塞

tcp大文件传输,全部write成功,read接收到部分后阻塞。 小文件传输没问题。 ``` //传输数据结构体 typedef struct ResponeBody{ int packindex;//4 byte char type;//2 byte char status;//2 byte int datalen;//4 byte int datatotal;//4 byte char s_arg[24];//24 byte char data[SIZE_DATA]; }ResponeBody; ``` ``` //发送数据 while((num = read(fd, resp.data, SIZE_DATA)) > 0) { resp.type = getData; resp.status = 1; resp.datalen = num; res = my_write(socket, &resp, SIZE_RESP); if(res < 0){ return -1; } memset(&resp, 0, SIZE_RESP); } close(fd); ``` ``` //读取数据 int ret = -1; while(1){ num = read(socket, &resp, SIZE_RESP); if(num <= 0 || len_recv >= datatotal){ printf("get success\n"); ret = 0; break; } if(0 == resp.status || resp.type != getData){ ret = -1; break; } write(fd, resp.data, resp.datalen); len_recv += num-SIZE_INFO; printf("get ----[%2.2f%%]----\n", len_recv/(double)datatotal * 100); memset(&resp, 0, SIZE_RESP); } ```

【新手】socket服务器获取浏览器请求时inputstream.read()返回值出问题

通过socket练习手写服务器,希望在服务器接收浏览器提交请求时通过循环执行inputstream.read()获取数据放入byte[1024]中,转成字符串最后输出至控制台,但在测试时虽然浏览器提交的测试数据不到1024字节,在第一次循环时inputsrteam.read()的返回值既不是-1也不是1024,而是接受到的数据实际大小(大约400多字节),导致第二次进入while循环,程序就阻塞在第二次inputstream.read()中,此时浏览器再次提交表单时服务器这边就直接报错了,报错点仍然指向while循环判断中的inputstream.read(),这明显不合理啊,向各位大佬求解。。。 源码: ``` package test; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; public class Server { ServerSocket server; public static void main(String[] args) { Server server = new Server(); server.start(); } public void start() { try { server = new ServerSocket(8888); receive(); } catch (IOException e) { System.out.println("开启数据库失败"); e.printStackTrace(); } } private void receive() { try { Socket client = server.accept(); byte[] buff = new byte[1024]; StringBuilder sb = new StringBuilder(); BufferedInputStream bis = new BufferedInputStream(client.getInputStream()); while (-1 != bis.read(buff)) { sb.append(new String(buff, 0, buff.length)); } String requestInfo = sb.toString().trim(); System.out.println(requestInfo); } catch (IOException e) { e.printStackTrace(); System.out.println("开启客户端socket失败"); } } public void stop() { } } ``` 浏览器第二次提交表单时,服务器这边的报错信息,(浏览器第一次提交表单时程序处于阻塞状态): ``` java.net.SocketException: Connection reset 开启客户端socket失败 at java.net.SocketInputStream.read(SocketInputStream.java:210) at java.net.SocketInputStream.read(SocketInputStream.java:141) at java.io.BufferedInputStream.fill(BufferedInputStream.java:246) at java.io.BufferedInputStream.read1(BufferedInputStream.java:286) at java.io.BufferedInputStream.read(BufferedInputStream.java:345) at java.io.FilterInputStream.read(FilterInputStream.java:107) at test.Server.receive(Server.java:48) at test.Server.start(Server.java:24) at test.Server.main(Server.java:17) ```

关于java网络编程中获取输入流中数据的问题?

//服务器端接收消息的类。定制端口号为8888 serviceSocket = new ServerSocket(10000); //获取socket。这个方法是阻塞式的 socket = serviceSocket.accept(); inputStream = socket.getInputStream(); byte buf[] = new byte[1024]; int len = 0; len =inputStream.read(buf); //打印客户端的消息 System.out.println(new String(buf,0,len)); //向客户端生成响应 outputStream = socket.getOutputStream(); outputStream.write("收到".getBytes()); 使用如上代码没然后问题。服务端可以获取客户端的数据。客户端也可以获取服务端的响应。但如果把其中inputStream的读取数据方式改为如下: while((len=inputStream.read(buf))>0){ //此处拼接客户端的消息 } //在循环外向客户端相应 outputStream = socket.getOutputStream(); outputStream.write("收到".getBytes()); 此时就会出错。服务端无法获取客户端的数据。客户端也无法获取服务端的响应。通过一个循环来不断读取流中的数据是io流的通常做法。为什么这儿不行。。。求解。

io.Copy原因无法在golang中分配内存

<div class="post-text" itemprop="text"> <p>I use compress/gzip to decompress files</p> <pre><code>func DecompressZip(src string, target string) error { f, err := os.Open(src) if err != nil { return errors.Wrap(err, "can't open tar source file:"+src) } defer f.Close() zipReader, err := gzip.NewReader(f) if err != nil { return errors.Wrap(err, "can't gzip source file"+src) } defer zipReader.Close() unzipFile, err := CreateFileAnyway(target) // return *os.file if err != nil { return errors.Wrap(err, "can't create target file"+target) } defer unzipFile.Close() if _, err := io.Copy(unzipFile, zipReader); err != nil { return errors.Wrap(err, "can't unzip to file :"+target) } return nil } func CreateFileAnyway(path string) (*os.File, error) { if _, err := os.Stat(path); err == nil { return os.Create(path) } else { i := len(path) for i &gt; 0 &amp;&amp; !os.IsPathSeparator(path[i-1]) { i-- } if i &gt; 0 { if err := os.MkdirAll(path[:i], 0777); err != nil { return nil, err } } return os.Create(path) } } </code></pre> <p>this code encounted an error on <code>io.Copy</code>,the log: <code>can't unzip to file :***: write ***: cannot allocate memory</code></p> <p>The ziped file 300M, unziped file is 5G. Memory: 2048M.</p> </div>

Golang TCP Client无法从服务器接收数据,在conn.Read()上挂起/阻止

<div class="post-text" itemprop="text"> <p>I'm taking a dive into the networking side of Go, and I'd thought I'd start with a TCP Client and Server.</p> <p>I am able to get the client to connect to the server and send a simple message ("Hello") successfully. However, I can not get the server to send back a response (or the get the client to read the response).</p> <p>Here is the code.</p> <p><strong>Server</strong></p> <pre><code>Address := "localhost:9999" Addr, err := net.ResolveTCPAddr("tcp", Address) if err != nil { log.Fatal(err) } listener, err := net.ListenTCP("tcp", Addr) if err != nil { log.Fatal(err) } defer listener.Close() //server loop for { conn, err := listener.Accept() if err != nil { continue } go handle(conn) } func handle(c net.Conn) { totalBytes, message := connRead(c) fmt.Println(c.RemoteAddr()) fmt.Println(string(message[:totalBytes])) c.Write([]byte("Hi")) fmt.Println("Replied") c.Close() } func connRead(c net.Conn) (int, []byte) { buffer := make([]byte, 4096) totalBytes := 0 for { n, err := c.Read(buffer) totalBytes += n if err != nil { if err != io.EOF { log.Printf("Read error: %s", err) } break } } return totalBytes, buffer } </code></pre> <p><strong>Client</strong></p> <pre><code> tcpAddr, err := net.ResolveTCPAddr("tcp", "localhost:9999") if err != nil { log.Fatal(err) } conn, err := net.DialTCP("tcp", nil, tcpAddr) if err != nil { log.Fatal(err) } defer conn.Close() _, err = conn.Write([]byte("Hello")) if err != nil { log.Fatal(err) } tBytes, resp := connRead(conn) fmt.Println(tBytes) fmt.Println(string(resp[:tBytes])) func connRead(c net.Conn) (int, []byte) { buffer := make([]byte, 4096) totalBytes := 0 for { fmt.Println("Stuck?") n, err := c.Read(buffer) fmt.Println("Stuck.") totalBytes += n fmt.Println(totalBytes) if err != nil { if err != io.EOF { log.Printf("Read error: %s", err) } break } } return totalBytes, buffer } </code></pre> <p>From what I can tell it's not a problem with the server. When I run the client, everything stops right after <code>fmt.Println("Stuck?")</code>. This leads me to belive that it's messing up in the <code>n, err := c.Read(buffer)</code> statement somehow. The server doesn't even print out the messeage length (5) and message ("Hello") untill after I Ctrl-C the client. If I comment out the read and printings in the client, then things run smoothly.</p> <p>I've tried googling for answers, but nothing has come up. </p> <p>What am I doing wrong? Am I using conn.Read() wrong in the client?</p> <p><strong>EDIT:</strong></p> <p>I actually do have access to Linux, so here are the SIGQUIT dumps for the pertinent functions.</p> <p><em>Server</em></p> <p><a href="http://pastebin.com/itevngCq" rel="nofollow">http://pastebin.com/itevngCq</a></p> <p><em>Client</em></p> <p><a href="http://pastebin.com/XLiKqkvs" rel="nofollow">http://pastebin.com/XLiKqkvs</a></p> </div>

inputStream中read()疑问求解

ApI说read()方法返回一个0-255之间的int值,如果被读取的文件存储的是文字比如"你好" 那么返回的字节(默认编码表=GBK)不应该是负数么?(被读取文件编码是GBK) 我在Java中试了一下,被读取文件是你好,返回的是四个正数,而我设定一个 String s="你好"; byte[]bytes=s.getBytes(); for(byte b:bytes){ System.out.println(b); }得到的是四个负数(-60,-29,-70,-61) 小白一枚,请通俗易懂一些

java网络编程中IO数据输入输出阻塞

服务端代码如下: public class Server {   public static void main(String[] args) throws IOException {     ServerSocket ss = new ServerSocket(30000);     Socket socket = ss.accept();     PrintStream ps = new PrintStream(socket.getOutputStream());     ps.println("服务器第一行数据"); //1     ps.println("服务器第二行数据"); //2     ocket.shutdownOutput(); //3     //下面语句将输出false     System.out.println(socket.isClosed());     Scanner scan = new Scanner(socket.getInputStream());     BufferedReader br = new BufferedReader(new     InputStreamReader(socket.getInputStream()));     //为什么只得到客户端第一条数据     if(scan.hasNext()) {       System.out.println(scan.nextLine());     }     //为什么此处得不到数据      while(br.readLine() != null) {       System.out.println(br.readLine());     }     scan.close();     br.close();     socket.close();     ss.close();     } } 客户端代码如下: public class Client {   public static void main(String[] args) throws IOException {     Socket s = new Socket("localhost", 30000);     Scanner scan = new Scanner(s.getInputStream());     // 为什么只能得到服务端第一条数据     if (scan.hasNextLine()) {       System.out.println(scan.nextLine());     }     PrintStream ps = new PrintStream(s.getOutputStream());     ps.println("客户端的第一行数据");     ps.println("客户端的第二行数据");     ps.close();     scan.close();     s.close();   } } 服务端运行结果: false 客户端的第一行数据 客户端运行结果: 服务器第一行数据 如上述所示,服务端在 //1,//2处已经将数据输出到socket输出流了,在//3处才关闭输出功能,为什在客户端得到的数据只能显示一条 同样,客户端输出了两条数据,在服务端关闭输出,输入功能应该不收影响,为什么也只能得到一条数据。

C# 操作串口提示错误:由于IO线程退出或应用程序请求,已中止IO操作。

贴出代码 1.线程循环发送 public void PortListenThread() { while (true) { byte[] query = new byte[8] { 0x01, 0x02, 0x00, 0x00, 0x00, 0x10, 0x79, 0xC6 }; serPort.DiscardInBuffer(); serPort.Write(query, 0, query.Length); Delay(500); } } 2.一个字节自动触发接收 public void IO_EventHandler(object sender, SerialDataReceivedEventArgs e) { int count = 0; Delay(100); count = serPort.BytesToRead; if (count < 6) { serPort.DiscardInBuffer(); } else if (count > 6) { byte[] readBuffer = new byte[count]; try { serPort.Read(readBuffer, 0, count);//报错:由于IO线程退出或应用程序请求,已中止IO操作。 } catch (Exception a) { MessageBox.Show(a.Message); }

关于建立一个TCP服务端出现阻塞问题

************************************ 这里是tcp客户端的代码 ************************************ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; public class Socket_client { public static void main(String[] args) throws UnknownHostException, IOException { //first,创建一个socket对象 Socket s = new Socket("192.168.1.107",20000); //second,获取Socket中的输出流 OutputStream out = s.getOutputStream(); //third,发送信息 out.write("嘿嘿嘿".getBytes()); //添加读取服务器返回信息功能 //使用socket流读取服务器返回数据 InputStream in = s.getInputStream(); byte[] b = new byte[1024]; int len = in.read(b); String str = new String(b,0,len); System.out.println(str); //关闭资源 s.close(); } } ************************************ 这里是tcp服务端的代码 ************************************ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Server_Socket { public static void main(String[] agrs) throws IOException{ //先建立一个服务Socket ServerSocket ss = new ServerSocket(20000); //获取客户Socket对象 Socket s = ss.accept(); //使用客户的Socket对象将信息打印出来 InputStream in = s.getInputStream(); byte[] b = new byte[1024]; int len; while((len = in.read(b))!=-1){ //问题就出在这里,用循环读取,读取-1时,出现阻塞,后面代码无法运行 String str = new String(b,0,len); System.out.println(str); } //使用客户的Socket对象将成功接受信息的信息反馈给客户端 OutputStream out = s.getOutputStream(); out.write("成功接受到信息".getBytes()); //关闭资源 s.close(); ss.close(); } } 先执行了服务端,然后再执行客户端,服务端收到客户端发来的string后阻塞了,客户端也阻塞了,无法接受服务端回复的string 如果我把服务端循坏代码改成如下: //使用客户的Socket对象将信息打印出来 InputStream in = s.getInputStream(); byte[] b = new byte[1024]; int len = in.read(b); String str = new String(b,0,len); System.out.println(str); -------------------------------------------------- 程序能正常运行,为何,求解?

当脚本因阻塞io而超时时,如何生成自定义响应?

<div class="post-text" itemprop="text"> <h1>Goal</h1> <p>I am developing a JSON endpoint that basically reads data from a server-side COM port into a file (on the server end) when a user sends a GET request to it. The response from the server has to be a properly formed JSON response containing the name of the file where the contents were dumped to. If the COM port takes too long to respond, the file is closed and still considered valid with whatever contents it did read from the COM port. A valid response is still provided.</p> <h1>Problem</h1> <p>When the COM port is no longer being fed data, it blocks until the script times out. This results in an error and IIS provides a generic error page on a json endpoint. This is not valid json, but it also does not contain the name of the file where the com data was dumped to.</p> <h1>Details</h1> <ul> <li>I have to use the PHP Direct IO extension to interface with a serial com port.</li> <li>This is blocking IO, and on windows, asynchronous IO is not supported (as far as I have seen.)</li> <li>register_shutdown_function does not guarantee it is executed while a connection is still open to the client, so I cannot use this to print a valid response. </li> </ul> </div>

ioutil.ReadAll(response.Body)永远阻止-Golang

<div class="post-text" itemprop="text"> <pre><code>tr := &amp;http.Transport{ TLSClientConfig: &amp;tls.Config{InsecureSkipVerify: true}, } client := &amp;http.Client{Transport: tr} response, err := client.Get(link) if err != nil { fmt.Println(err) } defer response.Body.Close() //block forever at the next line content, _ = ioutil.ReadAll(response.Body) </code></pre> <p>The above is my code to read content from a webpage which resides in a loop. I found sometimes the line <code>ioutil.ReadAll(response.Body)</code> will block forever. This happens randomly, however, it almost always happens on this webpage: <code>http://xkcd.com/55</code> . It's very interesting that when I do <code>curl http://xkcd.com/55</code>, it returns nothing, however, <code>wget http://xkcd.com/55</code> returns the whole webpage.</p> </div>

java socket read timeout

大神们有没有遇到过网络通信实机上成功了,但是socket的read就是失败的情况(timeout)啊。 wireshark抓包确认服务器端的数据已经回来了。 用winsocket写个测试程序也是ok的。 设置socket的Timeout时间为10s也不行

新手,请问tcp服务器bufio.Reader和Conn.Read(buff)有区别么,哪个性能更好一点

新手,请问tcp服务器bufio.Reader和Conn.Read(buff)有区别么,哪个性能更好一点, 看文档bufio包有缓存,但是不清楚和net包的区别,想知道都有哪些应用场景?

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

Java校招入职华为,半年后我跑路了

何来 我,一个双非本科弟弟,有幸在 19 届的秋招中得到前东家华为(以下简称 hw)的赏识,当时秋招签订就业协议,说是入了某 java bg,之后一系列组织架构调整原因等等让人无法理解的神操作,最终毕业前夕,被通知调往其他 bg 做嵌入式开发(纯 C 语言)。 由于已至于校招末尾,之前拿到的其他 offer 又无法再收回,一时感到无力回天,只得默默接受。 毕业后,直接入职开始了嵌入式苦旅,由于从未...

Java基础知识面试题(2020最新版)

文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类有何不同?Java应用程序与小程序之间有那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的对比基础语法数据类型Java有哪些数据类型switc...

@程序员:GitHub这个项目快薅羊毛

今天下午在朋友圈看到很多人都在发github的羊毛,一时没明白是怎么回事。 后来上百度搜索了一下,原来真有这回事,毕竟资源主义的羊毛不少啊,1000刀刷爆了朋友圈!不知道你们的朋友圈有没有看到类似的消息。 这到底是啥情况? 微软开发者平台GitHub 的一个区块链项目 Handshake ,搞了一个招募新会员的活动,面向GitHub 上前 25万名开发者派送 4,246.99 HNS币,大约价...

再不跳槽,应届毕业生拿的都比我多了!

跳槽几乎是每个人职业生涯的一部分,很多HR说“三年两跳”已经是一个跳槽频繁与否的阈值了,可为什么市面上有很多程序员不到一年就跳槽呢?他们不担心影响履历吗? PayScale之前发布的**《员工最短任期公司排行榜》中,两家码农大厂Amazon和Google**,以1年和1.1年的员工任期中位数分列第二、第四名。 PayScale:员工最短任期公司排行榜 意外的是,任期中位数极小的这两家公司,薪资...

我以为我学懂了数据结构,直到看了这个导图才发现,我错了

数据结构与算法思维导图

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

华为初面+综合面试(Java技术面)附上面试题

华为面试整体流程大致分为笔试,性格测试,面试,综合面试,回学校等结果。笔试来说,华为的难度较中等,选择题难度和网易腾讯差不多。最后的代码题,相比下来就简单很多,一共3道题目,前2题很容易就AC,题目已经记不太清楚,不过难度确实不大。最后一题最后提交的代码过了75%的样例,一直没有发现剩下的25%可能存在什么坑。 笔试部分太久远,我就不怎么回忆了。直接将面试。 面试 如果说腾讯的面试是挥金如土...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

win10暴力查看wifi密码

刚才邻居打了个电话说:喂小灰,你家wifi的密码是多少,我怎么连不上了。 我。。。 我也忘了哎,就找到了一个好办法,分享给大家: 第一种情况:已经连接上的wifi,怎么知道密码? 打开:控制面板\网络和 Internet\网络连接 然后右击wifi连接的无线网卡,选择状态 然后像下图一样: 第二种情况:前提是我不知道啊,但是我以前知道密码。 此时可以利用dos命令了 1、利用netsh wlan...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

总结了 150 余个神奇网站,你不来瞅瞅吗?

原博客再更新,可能就没了,之后将持续更新本篇博客。

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

程序员写出这样的代码,能不挨骂吗?

当你换槽填坑时,面对一个新的环境。能够快速熟练,上手实现业务需求是关键。但是,哪些因素会影响你快速上手呢?是原有代码写的不够好?还是注释写的不够好?昨夜...

!大部分程序员只会写3年代码

如果世界上都是这种不思进取的软件公司,那别说大部分程序员只会写 3 年代码,恐怕就没有程序员这种职业。

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

HTTP与HTTPS的区别

面试官问HTTP与HTTPS的区别,我这样回答让他竖起大拇指!

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

程序员为什么千万不要瞎努力?

本文作者用对比非常鲜明的两个开发团队的故事,讲解了敏捷开发之道 —— 如果你的团队缺乏统一标准的环境,那么即使勤劳努力,不仅会极其耗时而且成果甚微,使用...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

终于懂了TCP和UDP协议区别

终于懂了TCP和UDP协议区别

Python爬虫,高清美图我全都要(彼岸桌面壁纸)

爬取彼岸桌面网站较为简单,用到了requests、lxml、Beautiful Soup4

立即提问
相关内容推荐