码迷,mamicode.com
首页 > 其他好文 > 详细

TCP的socket连接

时间:2019-10-21 09:42:22      阅读:71      评论:0      收藏:0      [点我收藏+]

标签:div   实例   定义   decode   channels   data   can   sre   open   

  1 package newtest;
  2 
  3 import java.io.BufferedReader;
  4 import java.io.IOException;
  5 import java.io.InputStreamReader;
  6 import java.net.InetSocketAddress;
  7 import java.net.Socket;
  8 import java.nio.ByteBuffer;
  9 import java.nio.channels.Channel;
 10 import java.nio.channels.SelectionKey;
 11 import java.nio.channels.Selector;
 12 import java.nio.channels.ServerSocketChannel;
 13 import java.nio.channels.SocketChannel;
 14 import java.nio.charset.Charset;
 15 
 16 public class TcpServer
 17 {
 18     //用于检测所有Channel状态的selector
 19     private Selector selector = null;
 20     //定义编码格式
 21     private Charset charset = Charset.forName("UTF-8");
 22 
 23     public void init()throws IOException
 24     {
 25         selector = Selector.open();
 26         //通过open方法来打开一个未绑定的ServerSocketChannel实例
 27         ServerSocketChannel server  = ServerSocketChannel.open();
 28         InetSocketAddress isa = new InetSocketAddress("127.0.0.1", 8899);
 29         //将该ServerSocketChannel绑定到指定IP地址
 30         server.socket().bind(isa);
 31         //设置ServerSocket以非阻塞方式工作
 32         server.configureBlocking(false);
 33         //将Server注册到指定Selector对象
 34         server.register(selector, SelectionKey.OP_ACCEPT);
 35 
 36         while(selector.select() > 0)
 37         {
 38             //依次处理Selector上的每个已选择的SelectionKey
 39             for(SelectionKey sk : selector.selectedKeys())
 40             {
 41                 //从selector上的已选择Key集中删除正在处理的SelectionKey
 42                 selector.selectedKeys().remove(sk);
 43                 //如果sk对应的通道包含客户端的连接请求
 44                 if(sk.isAcceptable())
 45                 {
 46                     //调用accept方法接受连接,产生服务器端对应的SocketChannel
 47                     SocketChannel sc = server.accept();
 48                     //设置非阻塞方式工作
 49                     sc.configureBlocking(false);
 50                     //将该SocketChnnel也注册到selector
 51                     sc.register(selector, SelectionKey.OP_READ);
 52                     //将sk对应的Channel设置成准备接受其它请求
 53                     sk.interestOps(SelectionKey.OP_ACCEPT);
 54                 }
 55                 //如果sk对应的通道有数据需要读取
 56                 if(sk.isReadable())
 57                 {
 58                     //获取该SelectionKey对应的Channel,该Channnel中有可读的数据
 59                     SocketChannel sc = (SocketChannel)sk.channel();
 60                     //定义准备执行读取数据的ByteBuffer
 61                     ByteBuffer buff = ByteBuffer.allocate(1024);
 62                     String content =  "";
 63                     //开始读数据
 64                     try
 65                     {
 66                         while(sc.read(buff) > 0)
 67                         {
 68                             buff.flip();
 69                             content += charset.decode(buff);
 70                         }
 71                         //打印从该sk对应的Channel里读到的数据
 72                         System.out.println("消息:" + content);
 73                         //将sk对应的Channel设置成准备下一次读取
 74                         sk.interestOps(SelectionKey.OP_READ);
 75                     }
 76                     //如果捕捉到该sk对应的Channel出现了异常,即表明该Channel对应的Client出现了问题
 77                     //所以从Selector中取消sk的注册
 78                     catch(IOException ex)
 79                     {
 80                         //从Selector中删除指定的SelectionKey
 81                         sk.cancel();
 82                         if(sk.channel() != null)
 83                         {
 84                             sk.channel().close();
 85                         }
 86                     }
 87 //                    throw new IOException();
 88                     //如果content的长度大于0,即聊天信息不为空
 89                     if(content.length() > 0)
 90                     {
 91                         //遍历该selector里注册的所有selectionKey
 92                         for(SelectionKey key : selector.keys())
 93                         {
 94                             //获取该channel是SocketChannel对象
 95                             Channel targetChannel = key.channel();
 96                             if(targetChannel instanceof SocketChannel)
 97                             {
 98                                 //将读到的内容写入该Channel中
 99                                 SocketChannel dest = (SocketChannel)targetChannel;
100                                 dest.write(charset.encode(content));
101                             }
102                         }
103                     }
104                 }
105             }
106         }
107     }
108 
109     public static void main(String[] args)throws IOException
110     {
111         System.out.println("===========TCP的server端启动=============");
112         new TcpServer().init();
113     }
114 }
package com.springboot.springbootswagger.client;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class TcpClient {
    // initialize socket and input output streams
    private Socket socket            = null;
    private DataInputStream  input   = null;
    private DataOutputStream out     = null;

    // constructor to put ip address and port
    public TcpClient(String address, int port)
    {
        // establish a connection
        try
        {
            socket = new Socket(address, port);
            System.out.println("Connected");

            // takes input from terminal
            input  = new DataInputStream(System.in);


            out    = new DataOutputStream(socket.getOutputStream());
        }
        catch(UnknownHostException u)
        {
            System.out.println(u.toString());
        }
        catch(IOException i)
        {
            System.out.println(i);
        }

        // 待读入的String
        String line = "";

        // 一直读到Over字符停止
        while (!line.equals("Over"))
        {
            try
            {
                line = input.readLine();
                out.writeUTF(line);
            }
            catch(IOException i)
            {
                System.out.println(i);
            }
        }

        // 关闭连接
        try
        {
            input.close();
            out.close();
            socket.close();
        }
        catch(IOException i)
        {
            System.out.println(i);
        }
    }

    public static void main(String args[])
    {
        TcpClient client = new TcpClient("127.0.0.1", 8899);
    }
}

 

TCP的socket连接

标签:div   实例   定义   decode   channels   data   can   sre   open   

原文地址:https://www.cnblogs.com/chenyun-/p/11711500.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!