TCP:
    建立连接通道
    数据无限制
    速度慢
    可靠

TCP协议发送数据:
1:创建发送端的Socket对象 这一步如果成功,就说明连接已经建立成功了。
2:获取输出流,写数据
3:释放资源

    public static void main(String[] args) throws IOException {
        // 创建发送端的Socket对象
        // Socket(InetAddress address, int port)   创建指定 IP 地址,指定端口号的socket对象
        // Socket(String host, int port) 创建指定 指定主机,指定端口号的socket对象
        // Socket s = new Socket(InetAddress.getByName("192.168.12.92"), 123);
        Socket s = new Socket("192.168.1.104", 123);

        //   返回此套接字的输出流。
        // public OutputStream getOutputStream()
        OutputStream os = s.getOutputStream();
        os.write("我是发送端".getBytes());//将数据发送到通道
        // 释放资源
        s.close();
    }

TCP协议接收数据:
1:创建接收端的Socket对象
2:监听客户端连接。返回一个对应的Socket对象
3:获取输入流,读取数据显示在控制台
4:释放资源

    public static void main(String[] args) throws IOException {
        // 创建接收端的Socket对象
        // ServerSocket(int port)
        ServerSocket ss = new ServerSocket(123);

        // 监听客户端连接。返回一个对应的Socket对象,建立连接通道
        // public Socket accept()
        Socket s = ss.accept(); // 侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。如果通道没有连接,接收端代码就停在这里

        // 获取输入流,读取数据显示在控制台
        InputStream is = s.getInputStream();

        //读取数据
        byte[] bys = new byte[1024];
        int len = is.read(bys); // 阻塞式方法,如果发送端一直没有发内容过来,接收端代码就停在这里
        String str = new String(bys, 0, len);
        //获取发送端Ip
        String ip = s.getInetAddress().getHostAddress();
        System.out.println(ip + "---" + str);
        // 释放资源
        s.close();
    }
输出:
192.168.1.104---我是发送端

多线程实现接收端,多个发送端的TCP

发送端:

    public static void main(String[] args) throws IOException {
        // 创建客户端Socket对象
        Socket s = new Socket("192.168.1.104", 123);

        // 读取文件的流
        BufferedReader br = new BufferedReader(new FileReader("a.txt"));
        // 通道写入流
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

        //将数据写入到通道
        String line = null;
        while ((line = br.readLine()) != null) {// 阻塞
            bw.write(line);
            bw.newLine();
            bw.flush();
        }

        // Socket  禁用此套接字的输出流。告诉接收端,数据已经发送完毕,你不要堵塞了
        s.shutdownOutput();
        // 获取接收端反馈过来的数据
        BufferedReader brClient = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String str = brClient.readLine(); // 阻塞,等待接收端数据发送完毕
        System.out.println(str);
        // 释放资源
        br.close();
        s.close();
    }
输出:
文件已经上传成功了

接收端:



    public static void main(String[] args) throws IOException {
        // 创建服务器Socket对象
        ServerSocket ss = new ServerSocket(123);
        //一直创建服务器,对象是同一个,不过重复监听的过程
        while (true) {
            Socket s = ss.accept();//建立连接通道,堵塞,// 监听客户端连接
            new Thread(new ServiceThread (s)).start();
        }

}

接收端多线程的实现

public class ServiceThread implements Runnable {
    private Socket s;

    public UserThread(Socket s) {
        this.s = s;
    }

    @Override
    public void run() {
        try {
            // 封装通道内的流
            BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));


            // 为了防止名称冲突
            String newName = System.currentTimeMillis() + ".txt";
            BufferedWriter bw = new BufferedWriter(new FileWriter(newName));

            String line = null;
            while ((line = br.readLine()) != null) { // 阻塞
                bw.write(line);
                bw.newLine();
                bw.flush();
            }

            // 给出反馈给发送端
            BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
            bwServer.write("文件已经上传成功了");
            bwServer.newLine();
            bwServer.flush();
            s.shutdownOutput();
            // 释放资源
            bw.close();
            s.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

结果:
这里写图片描述
注意:可以开启多个发送端进行,因为接收端一直在重复监听

posted on 2017-04-07 14:31  2637282556  阅读(652)  评论(0编辑  收藏  举报