java socket tcp

7哥 发布于 2016/05/03 15:36
阅读 254
收藏 0

一个server ,一个client

当server第一次发送完数据后,对流close,客户端则能受到数据,发送第二条数据时,则server端提示:socket is closed;


当server第一次发送完数据后,不关闭流,则client端一直阻塞,接受不到任何数据

加载中
0
公孙二狗
公孙二狗

最外层的流关闭了,内部的流也会同时关闭,也就是Socket的流也关闭了,再发数据就没发发了

公孙二狗
公孙二狗
回复 @7哥 : 用 PrintWriter.println() 试试
公孙二狗
公孙二狗
回复 @7哥 : 我写的时候 flush() 就能收到
7哥
7哥
如果不关闭流,客户端就接受不到数据
0
游客
游客
you should flush it when write finished
7哥
7哥
yes ,肯定 flush了,
0
hbdrawn
hbdrawn
码文贴出来
0
7哥
7哥
7哥
这个是发送数据的函数
0
7哥
7哥
7哥
这个是循环接收数据的函数
7哥
7哥
0
平安北京
flush之后,应该可以读到
0
songtzu
songtzu

我算网络通信这块开发的资深人士。。。

本来想回答你的问题的,但是看了看你贴的代码,猜测你还是学生。一看到练手的代码,我瞬间没有解答的念头了。建议你还是别整网络通信,你要消化这个需要几个月时间。

songtzu
songtzu
回复 @7哥 : 正规的Java 的IO,都会用bytebuffer来处理缓存。 我不是纯Javaer,按道理一个string是会发生\0截断的bug的。所以这块我感觉有问题。 代码贴少了。不好具体看。
7哥
7哥
白眼,鄙视你这种人,没意思
0
公孙二狗
公孙二狗
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {
    public static void main(String[] args) throws Exception {
        ServerSocket server = new ServerSocket(13930);
        Socket client = server.accept();
        PrintWriter writer = new PrintWriter(client.getOutputStream());

        int count = 0;
        while (true) {
            writer.println(count++);
            writer.flush();
            Thread.sleep(1000);
        }
    }
}


import java.net.Socket;
import java.util.Scanner;

public class SocketClient {
    public static void main(String[] args) throws Exception {
        Socket socket = new Socket("127.0.0.1", 13930);
        Scanner scanner = new Scanner(socket.getInputStream());

        while (scanner.hasNextLine()) {
            System.out.println(scanner.nextLine());
        }
    }
}


试试就发现可以不停的写入的,Client 也能接收到数据



0
让往事随风
让往事随风
看看Socket 网络基本编程吧,可能对你有帮助。
0
hibegin
hibegin
用了 read(byte[])=-1吧,这个是就不断开是不会读取到的。 TCP如果一个连接里面处理多次读写需要自己定通信格式来标示一个数据包的样子。
返回顶部
顶部