zoukankan      html  css  js  c++  java
  • 026.3 网络编程 TCP聊天

    分为客户端和服务端,分别进行收发操作
    ##########################################################################
    客户端:
    ###思路:
    1、建立tcp客户端服务
        1.1因为是面向连接,必须有连接才有通信
        1.2在创建客户端时,就必须明确目的地址和端口
    2、一旦连接建立,就有了传输数据的通道。就可以在通道中进行数据传输,这个传输是通过流实现的,是socket  io流
    3、获取socket  io中的写动作就可以发送给服务端

    ###步骤:
    1、创建socket对象,明确目的IP和端口
    2、通过socket对象的getOutStream方法获取OutputStream对象
    3、通过OutputStream对象写数据,实现发送
    4、关闭socket对象

    ###代码:
    System.out.println("client start");
    //1、创建客户端对象,明确目的和端口
    Socket s = new Socket("192.168.10.141",10000);
    //2、获取socket流中的输出流,将数据发送给服务端
    OutputStream out = s.getOutputStream();
    //3、通过输出流写数据
    out.write("I miss you".getBytes());
    //4、关闭资源
    s.close();

    ####################################################################
    服务端:
    ###思路:
    1、创建socket服务器端服务。服务器监听一个端口
    2、获取客户端对象
    3、获取客户端的socket流的读取流
    4、显示

    ###步骤:
    1、创建ServerSocket服务器对象
    2、通过ServerSocket对象的accept方法,获取客户端socket对象
    3、通过客户端socket对象的getInetAddress().getHostAddress()   方法获取ip对象然后获取ip
    4、通过客户端socket对象的getInputStream方法获取InputStream对象
    5、通过InputStream对象的read方法获取客户端发送的数据。
    6、关闭客户端socket对象。

    ###代码:
    System.out.println("服务器启动。。。");
    //1、创建服务器端对象
    ServerSocket ss = new ServerSocket(10003);
    //2、获取客户端对象
    Socket s = ss.accept();
    String ip = s.getInetAddress().getHostAddress();
    System.out.println(ip+"...connect");
    //3、通过客户端对象获取socket流的读取流
    InputStream in = s.getInputStream();
    byte[] buf = new byte[1024];
    int len = in.read(buf);
    String str = new String(buf,0,len);
    System.out.println(str);
    
    s.close();

    ################################################################################
    简单互动的TCP通讯

    /*###
     * 案例二:实现客户端和服务端的收发过程。
     * 客户端
     */
    System.out.println("客户端2 启动.......");
    //        创建客户端socket对象。明确服务端地址和端口。
    Socket s = new Socket("192.168.1.223", 10004);
    //        发送数据,通过socket输出流完成。
    OutputStream out = s.getOutputStream();
    out.write("服务端,我来了".getBytes());
    //        读取服务端返回的数据,通过socket输入流
    InputStream in = s.getInputStream();
    byte[] buf = new byte[1024];
    int len = in.read(buf);
    String text = new String(buf,0,len);
    System.out.println(text);
    //        关闭资源。
    s.close();
    /*###
     * 案例二:实现客户端和服务端的收发过程。 服务器端。
     */
    System.out.println("服务端2启动.....");
    // 创建tcp服务端socket 明确端口。
    ServerSocket ss = new ServerSocket(10004);
    while (true) {
        // 获取客户端对象。
        Socket s = ss.accept();
        System.out.println(s.getInetAddress().getHostAddress()
                + ".....connected");
        // 读取客户端的发送过来的数据
        InputStream in = s.getInputStream();
        byte[] buf = new byte[1024];
        int len = in.read(buf);
        String text = new String(buf, 0, len);
        System.out.println(text);
        // 给客户端回馈数据。
        OutputStream out = s.getOutputStream();
        out.write("客户端,我已到收到,哦耶!".getBytes());
        // 关闭客户端
        s.close();
    }
    // 关闭服务端。如果不断的获取客户端,不用关闭服务端。
    //        ss.close();

    ###########################################################################
    我想写一个可以多次发送信息的程序,没有找到哪里错了

    public class TCPServer2
    {
        public static void main(String[] args) throws IOException
        {
            ServerSocket ss = new ServerSocket(10005);
            Socket s = ss.accept();
            ServerReceive sr = new ServerReceive(s);
            ServerSend ssend = new ServerSend(s);
            new Thread(sr).start();
            new Thread(ssend).start();
        }
    }
    
    
    class ServerSend implements Runnable{
        private Socket s;
        private OutputStream os;
        public ServerSend(Socket s) throws IOException {
            super();
            this.s = s;
            os = s.getOutputStream();
        }
    
        @Override
        public void run()
        {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String line = null;
            try {
                while((line = br.readLine()) != null){
                    
                    os.write(line.getBytes());
                    
                    if("//over".equals(line)){
                        break;
                    }
                }
                s.close();
            } catch (IOException e) {
            }
        }
    }
    
    class ServerReceive implements Runnable{
        private Socket s;
        private InputStream is;
        public ServerReceive(Socket s) throws IOException {
            super();
            this.s = s;
            is = s.getInputStream();
        }
    
        @Override
        public void run()
        {
            while(true){
                byte[] buf = new byte[1024];
                try {
                    int len = is.read(buf);
                    String str = new String(buf,0,len);
                    if("//over".equals(str)){
                        break;
                    }
                    System.out.println(str);
                    s.close();
                } catch (IOException e) {
                }
            }
        }
    }
    TCPServer
    public class TCPClient2
    {
        public static void main(String[] args) throws UnknownHostException, IOException
        {
            Socket bothSocket = new Socket("127.0.0.1",10005);
            Send2 send = new Send2(bothSocket);
            Receive2 receive = new Receive2(bothSocket);
            
            new Thread(send).start();
            new Thread(receive).start();
            
        }
    }
    
    //创建发送和接收的类,使用多线程,继承runnable接口
    //多线程发送类
    class Send2 implements Runnable{
        private Socket s;
        OutputStream os;
        public Send2(Socket s) throws IOException {
            super();
            this.s = s;
            os = s.getOutputStream();
        }
        @Override
        public void run()
        {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String line = null;
            try {
                while((line = br.readLine()) != null){
                    
                    os.write(line.getBytes());
                    
                    if("//over".equals(line)){
                        break;
                    }
                }
                s.close();
            } catch (IOException e) {
            }
        }
    }
    
    //多线程接收类
    class Receive2 implements Runnable{
        private Socket s;
        
        private InputStream is;
        public Receive2(Socket s) throws IOException {
            super();
            this.s = s;
        }
    
        @Override
        public void run()
        {
            while(true){
                byte[] buf = new byte[1024];
                try {
                    is = s.getInputStream();
                    int len = is.read(buf);
                    String str = new String(buf,0,len);
                    if("//over".equals(str)){
                        break;
                    }
                    System.out.println(str);
                    s.close();
                } catch (IOException e) {
                }
            }
        }
    }
    TCPClient
  • 相关阅读:
    编程谜题:提升你解决问题的训练场
    同态加密实现数据隐私计算,能让你的小秘密更加秘密
    interviewstreet pair
    x & (x 1)==0
    uva 11991 Easy Problem from Rujia Liu?
    hdoj 1230 火星A+B
    hdoj 1711 KMP Number Sequence
    HackerRank网站,为编码程序员们提供一个以编码谜题和现实生活中遇到的编码难题为基础的新兴的社交平台
    ACM博弈知识汇总
    hdoj 1202 水水更健康
  • 原文地址:https://www.cnblogs.com/-nbloser/p/9768557.html
Copyright © 2011-2022 走看看