zoukankan      html  css  js  c++  java
  • 简单的tcp聊天

    package com.pers.tcptest;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Scanner;
    
    import org.junit.Test;
    
    public class TCPTest {
    
        @Test// 客户端
        public void client() {
            Socket socket = null;
            Scanner scanner = null;
            OutputStream os = null;
            InputStream is = null;
            try {
                socket = new Socket(InetAddress.getByName("127.0.0.1"), 9092);
                // 输出流 程序到数据 write
                os = socket.getOutputStream();
                System.out.println("请输入多个字符:");
                // 封装键盘输入流
                scanner = new Scanner(System.in);
                String str = scanner.next();
                os.write(str.getBytes());//发送出去
                //必须加上  表示我这边发送结束   服务端可以read去循环读取了  交互性
                socket.shutdownOutput();
                // 输入流 把数据读到程序中 显示出来
                is = socket.getInputStream();
                byte[] b = new byte[10];
                int len;
                while ((len = is.read(b)) != -1) {
                    String str2 = new String(b, 0, len);
                    System.out.println(str2);// str2是读取到的所有信息内容
                }
    
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                // 一定记得把稀缺的流资源关闭,一旦上面报错 关闭流 判断是否为null 避免还没创建流呢 就执行关闭 造成空指针异常
                if (is != null) {
                    try {
                        is.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
    
                try {
                    if (os != null) {
                        os.close();
                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                if (scanner != null)
                    scanner.close();
                try {
                    if (socket != null) {
                        socket.close();
                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    
            }
    
        }
    
        @Test// 服务端
        public void server() {
            ServerSocket ss = null;
            Socket socket = null;
            // 接受来自客户端的信息
            InputStream is = null;
            // 返回给客户端信息
            OutputStream os = null;
            try {
                ss = new ServerSocket(9092);
                socket = ss.accept();
                // 接受来自客户端的信息
                is = socket.getInputStream();
                byte[] b = new byte[10];//输入  就要 考虑接收一下读过来的字节数据
                int len;
                String str = new String();
                while ((len = is.read(b)) != -1) {//考虑多余10个字节的数据 一次读取不完  分批次放到str中
                    String str2 = new String(b, 0, len);
                    str += str2;
                                    System.out.println("服务端接收过来的信息是:"+str);
                }
                // 返回给客户端大写的串信息
                os = socket.getOutputStream();
                os.write(str.toUpperCase().getBytes());
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (os != null) {
                        os.close();
                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                try {
                    is.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                try {
                    socket.close();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                try {
                    ss.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
    ----------------------------------运行结果   先执行服务端 再执行客户端
    客户端
    请输入多个字符:  
    hdhaihdoihio   (点击回车,服务端接收转为大写之后再发送给客户端)
    HDHAIHDOIH   (因为一次读取10个字节  所以分两次读完的)
    IO
    服务端
    服务端接收过来的信息是:hdhaihdoih
    服务端接收过来的信息是:io           

     课余之外  可以去了解两个东东  如下:

  • 相关阅读:
    伟东云学堂—几何画板学习
    京北鲤鱼----创客教育
    几何画板学习网站
    快乐的搬运工
    少儿编程网
    科技学堂 Arduino轻松学
    跟张老师学硬件arduino板
    科技学堂 Arduino传感器入门
    巧办网
    项目:git+gitlab+jenkins+ansible上线网站
  • 原文地址:https://www.cnblogs.com/hoobey/p/7517602.html
Copyright © 2011-2022 走看看