TCP的socket连接

  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);
    }
}

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

时间: 2024-10-22 11:51:33

TCP的socket连接的相关文章

java下tcp的socket连接案例

package cn.stat.p4.ipdemo; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class serverDemo { /** * @param args * @t

java下tcp的socket连接

serverDemo package cn.stat.p4.ipdemo; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class serverDemo { /** * @param args * @throws IOException */ publ

外网客户端访问校园内网的服务器——socket连接

在做客户端与服务器的socket连接并发送数据应用中,通常有以下四种情况: 1).客户端在内网,服务器在内网. 对于这种情况,只需要用服务器的内网IP即可. 2).客户端在外网,服务器在内网. 对于这种情况,服务器可采用花生壳软件来进行外网IP与内网IP的映射. 3).客户端在内网,服务器在外网. 对于这种情况,只需要用服务器的外网IP即可. 4).客户端在外网,服务器在外网. 对于这种情况,只需要用服务器的外网IP即可. 从分析中可以看出,只有情况二是特殊的,由于服务器在内网,而客户端在外网,

socket连接和TCP连接的关系

我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如HTTP.FTP.TELNET等,也可以自己定义应用层协议.WEB使用HTTP协议作应用层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发到网络上. 1)Socket是一个针对TCP和UDP编程的接口,你可以借助它建立TCP连接等等.而TCP和UDP协议属于传输层 . 而http是个应用层的协议,它

TCP连接的三次握手,TCP/UDP区别联系,socket连接和http连接的区别

TCP连接的三次握手 1.第一次握手:客户端发送SYN + J包(syn = j)到服务器,并进入SYN_SEND状态,等待服务器确认: 2.第二次握手:服务器收到syn包,必须确认客户的SYN(A出口= j+1),同时自己也发送一个SYN+K包(syn =k),即SYN +ACK包,向服务器发送确认包ACK(ack = k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手, TCP/UDP区别联系 1.TCP的全称是传输控制协议,这种协议可以提供面向连接的,可靠地

运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接

运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接 最近在项目中可能要用到socket相关的东西来发送消息,所以初步研究了下socket的TCP和UDP实现方式,并且结合java1.5的concurrent.ExecutorService类来实现多线程. 具体实现方式见代码: 一.TCP方式: 1.服务端实现方式: TCP的服务端实现方式主要用到ServerSocket类,接收等待客户端连接的方法是accept(); 代码如下:类Sock

windows redis 连接错误Creating Server TCP listening socket 127.0.0.1:637 9: bind: No error

报错信息如下: [10036] 30 Dec 10:23:49.616 # Creating Server TCP listening socket 127.0.0.1:637 9: bind: No error[8660] 30 Dec 10:23:57.132 # Creating Server TCP listening socket *:6379: listen : Unknown error 解决方案如下按顺序输入如下命令就可以连接成功 1. Redis-cli.exe2. shutd

高性能 TCP Socket连接关闭释放集中调度类

/// <summary> /// Socket关闭调度类,此类提供了静态访问,但是此类可以实例化 /// </summary> /// <remarks> /// Socket连接关闭类 /// 3个队列 /// 1.shotdown 关闭队列 /// 步骤1 /// 2.close 队列 间隔2秒 /// 步骤2 /// 3.dispose 队列 间隔1秒 /// 步骤3 /// </remarks> public class CloseSoketDis

HTTP,TCP,Socket

TCP/IP三次握手和HTTP过程 1.TCP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上. 建立起一个TCP连接需要经过“三次握手”: 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SY