java的网络编程

java.net.Socket

Socket(套接字)封装了TCP协议的通讯细节,是的我们使用它可以与服务端建立网络链接,并通过 它获取两个流(一个输入一个输出),然后使用这两个流的读写操作完成与服务端的数据交互

ServerSocket运行在服务端,作用有两个:

  • 向系统申请服务端口,客户端的Socket就是通过这个端口与服务端建立连接的。
  • 监听服务端口,一旦一个客户端通过该端口建立连接则会自动创建一个Socket,并通过该Socket与客户端进行数据交互。
  • package socket;
    
    import java.io.IOException;
    import java.net.Socket;
    
    /**
     * 聊天室客户端
     */
    public class Client {
        /*
            java.net.Socket 套接字
            Socket封装了TCP协议的通讯细节,我们通过它可以与远端计算机建立链接,
            并通过它获取两个流(一个输入,一个输出),然后对两个流的数据读写完成
            与远端计算机的数据交互工作。
            我们可以把Socket想象成是一个电话,电话有一个听筒(输入流),一个麦克
            风(输出流),通过它们就可以与对方交流了。
         */
        private Socket socket;
    
        /**
         * 构造方法,用来初始化客户端
         */
        public Client(){
            try {
                System.out.println("正在链接服务端...");
                /*
                    实例化Socket时要传入两个参数
                    参数1:服务端的地址信息
                         可以是IP地址,如果链接本机可以写"localhost"
                    参数2:服务端开启的服务端口
                    我们通过IP找到网络上的服务端计算机,通过端口链接运行在该机器上
                    的服务端应用程序。
                    实例化的过程就是链接的过程,如果链接失败会抛出异常:
                    java.net.ConnectException: Connection refused: connect
                 */
                socket = new Socket("localhost",8088);
                System.out.println("与服务端建立链接!");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 客户端开始工作的方法
         */
        public void start(){
    
        }
    
        public static void main(String[] args) {
            Client client = new Client();
            client.start();
        }
    }
    
    package socket;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * 聊天室服务端
     */
    public class Server {
        /**
         * 运行在服务端的ServerSocket主要完成两个工作:
         * 1:向服务端操作系统申请服务端口,客户端就是通过这个端口与ServerSocket建立链接
         * 2:监听端口,一旦一个客户端建立链接,会立即返回一个Socket。通过这个Socket
         *   就可以和该客户端交互了
         *
         * 我们可以把ServerSocket想象成某客服的"总机"。用户打电话到总机,总机分配一个
         * 电话使得服务端与你沟通。
         */
        private ServerSocket serverSocket;
    
        /**
         * 服务端构造方法,用来初始化
         */
        public Server(){
            try {
                System.out.println("正在启动服务端...");
                /*
                    实例化ServerSocket时要指定服务端口,该端口不能与操作系统其他
                    应用程序占用的端口相同,否则会抛出异常:
                    java.net.BindException:address already in use
    
                    端口是一个数字,取值范围:0-65535之间。
                    6000之前的的端口不要使用,密集绑定系统应用和流行应用程序。
                 */
                serverSocket = new ServerSocket(8088);
                System.out.println("服务端启动完毕!");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 服务端开始工作的方法
         */
        public void start(){
            try {
                System.out.println("等待客户端链接...");
                /*
                    ServerSocket提供了接受客户端链接的方法:
                    Socket accept()
                    这个方法是一个阻塞方法,调用后方法"卡住",此时开始等待客户端
                    的链接,直到一个客户端链接,此时该方法会立即返回一个Socket实例
                    通过这个Socket就可以与客户端进行交互了。
                    
                    可以理解为此操作是接电话,电话没响时就一直等。
                 */
                Socket socket = serverSocket.accept();
                System.out.println("一个客户端链接了!");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) {
            Server server = new Server();
            server.start();
        }
    }
    

    客户端与服务端完成第一次通讯(发送一行字符串)


  • ①Socket提供了两个重要的方法:
    OutputStream getOutputStream()
    该方法会获取一个字节输出流,通过这个输出流写出的字节数据会通过网络发送给对方。

    InputStream getInputStream()
    通过该方法获取的字节输入流读取的是远端计算机发送过来的数据。
     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值