socket的理解与应用

  • socket的引入
    TCP协议的确很复杂, 我们不能要求每个程序员都去实现建立连接的3次握手, 累积确认,分组缓存, 这些应该是属于操作系统内核的部分, 没必要重复开发, 但是对于应用程序来讲, 操作系统需要抽象出一个概念, 让上层应用去编程。这个概念就是socket。
  • socket的五元组
    协议(UDP,TCP),客户端IP, 客户端Port, 服务器端IP, 服务器端Port
    • UDP: 传送速度快,但是容易丢失数据,可以用于视频聊天、语音聊天
    • TCP:传送稳定,不会丢失数据,如文件的上传、下载。
    • IP:用来唯一标识我们自己的电脑,是一个网络标识。
    • 端口号Port:用来区别当前电脑的应用程序。
  • TCP客户端和服务端通信
    • 客户端:创建一个socket,然后向服务器发起连接,连接上以后就可以发送,接收数据。
    • 服务端: 第一, 服务器是被动的, 所以它启动以后, 需要监听客户端发起的连接, 第二, 服务器要应付很多的客户端发起连接, 所以它通过服务端会可以自动给客户端分配IP, 也可以自动分配端口,将各个socket给区分开了。
/*
 * TCP 客户端
 * 
 * 1,创建客户端Socket对象,(指定要连接的服务器地址与端口号)
 * 2,获取服务器端的反馈回来的信息
 * 3,关闭流资源
 */
public class TCPClient {
    public static void main(String[] args) throws IOException {
        //1,创建客户端Socket对象,(指定要连接的服务器地址与端口号)
        Socket s = new Socket("192.168.74.58", 8888);
        //2,获取服务器端的反馈回来的信息
        InputStream in = s.getInputStream();
        //获取获取流中的数据
        byte[] buffer = new byte[1024];
        //把流中的数据存储到数组中,并记录读取字节的个数
        int length = in.read(buffer);
        //显示数据
        System.out.println( new String(buffer, 0 , length) );
        //3,关闭流资源
        in.close();
        s.close();
    }
}
/*
 * TCP 服务器端
 * 
 * 1,创建服务器ServerSocket对象(指定服务器端口号)
 * 2,开启服务器了,等待客户端的连接,当客户端连接后,可以获取到连接服务器的客户端Socket对象
 * 3,给客户端反馈信息
 * 4,关闭流资源
 */
public class TCPServer {
    public static void main(String[] args) throws IOException {
        //1,创建服务器ServerSocket对象(指定服务器端口号)
        ServerSocket ss = new ServerSocket(8888);
        //2,开启服务器了,等待客户端的连接,当客户端连接后,可以获取到连接服务器的客户端Socket对象
        Socket s = ss.accept();
        //3,给客户端反馈信息
        /*
         * a,获取客户端的输出流
         * b,在服务端端,通过客户端的输出流写数据给客户端
         */
        //a,获取客户端的输出流
        OutputStream out = s.getOutputStream();
        //b,在服务端端,通过客户端的输出流写数据给客户端
        out.write("你已经连接上了服务器".getBytes());
        //4,关闭流资源
        out.close();
        s.close();
        //ss.close();  服务器流 通常都是不关闭的
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值