• Java的TCP网络编程


    服务端代码:

    package socket;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * 聊天室服务端
     * @author 小明
     *
     */
    public class Server {
        /**
         * 运行在服务端的ServerSocket主要有两个作用:
         * 1:向系统申请服务端口,客户端就是通过这个端口与服务端建立连接的。
         * 2:监听服务端口,一旦客户端与服务端建立连接,就会
         * 自动创建一个Socket,并通过该Socket与建立连接的
         * 客户端进行交互。
         * 
         */
        private ServerSocket server;
        
        public Server()
        {
            try{
                /**
                 * 实例化ServerSocket的同时要指定向系统申请的服务端口。注意,该端口
                 * 不能与当前系统其它应用程序申请的端口号一致,
                 * 否则会抛出端口被占用的异常。
                 */
                System.out.println("正在启动服务端...");
                server = new ServerSocket(8088);
                System.out.println("服务端启动完毕!");
            }catch(Exception e){
                
            }
        }
        
        public void start()
        {
            try {
                System.out.println("等待客户端连接");
                Socket socket = server.accept();
                /**
                 * 准备接受客户端连接
                 * 
                 * 这是一个阻塞方法。
                 *一旦调用accpet()方法,服务端阻塞在这里,等着客户端连接了。
                 *这时当我们启动客户端时,客户端实例化socket,通过IP找到应用程序。
                 *这时accpet()马上就会有反应。accpet()方法执行完就返回一个socket。
                 *通过这个socket就可以与刚建立连接的这个客户端进行通讯了。
                 *客户端创建一个socket,服务端通过accept()接收一个socket。
                 *这时候就可以进行沟通了。
                 * 需要处理异常。
                 */
                InputStream in = socket.getInputStream();
                InputStreamReader isr = new InputStreamReader(in);
                BufferedReader br = new BufferedReader(isr);
                String message = br.readLine();
                System.out.println("客户端说:" + message);
                
                System.out.println("一个客户端连接了");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
        
        public static void main(String[] args) {
            Server server = new Server();
            server.start();
        }
        
    }

    需要先启动服务器端,客户端才启动。

    服务端运行后,accept()方法hi引起程序的阻塞。

    客户端代码:

    package socket;
    
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.net.UnknownHostException;
    
    /**
     * 聊天室客户端
     * @author 小明
     *
     */
    public class Client {
        /**
         * 套接字
         * 封装了TCP协议的通信细节,让我们可以简单地使用它完成TCP通讯
         * Socket连接后提供了两条流,通过两条流的读写操作完成与远端计算机的数据连接
         * 完成与远端计算机的数据交换。
         */
        private Socket socket;
        /**
         * 用来初始化客户端
         */
        public Client()
        {
            try {
                /**
                 * 实例化Socket时需要传入两个参数:
                 * 1:服务端的IP地址
                 * 2:服务端的端口号
                 * 通过IP地址可以找到服务端所在的计算机
                 * 通过端口可以找到运行在服务端计算机上的
                 * 服务端应用程序
                 * 注意,实例化Socket的过程就是连接的过程,若
                 * 连接失败就会抛出异常。
                 */
                System.out.println("正在连接服务端...");
                socket = new Socket("localhost", 8088);
                System.out.println("与服务端建立连接!");
                
                /**
                 * 有两个参数,一个是IP地址,一个是端口号
                 */
                /**
                 * 所有应用程序在使用网络的时候都要和操作系统申请一个网络端口
                 * 
                 */
                /**
                 * 异常要我们自己进行处理,不要抛出
                 */
            }catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
        
        /**
         * 写程序时不要过度依赖main方法
         * 客户端开始工作的方法
         */
        public void start()
        {
            try{
                //socket.getOutputStream();
                PrintWriter pw = new PrintWriter(
                new BufferedWriter(
                new OutputStreamWriter(
                socket.getOutputStream())), true);
                //pw.write("你好服务端");
                //使用上面这条语句是错的,要使用具有自动行刷新的方法
                //不要再下意识地写上面那条语句了
                pw.println("你好服务端!");
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        public static void main(String[] args) {
            Client client = new Client();
            
            client.start();
            
        }
    }

    建立第二个服务端时,发信息给服务端时没有反应。

    因为只调用了一次accept()方法,所以接收不到信息。

  • 相关阅读:
    ElasticSearch工作原理
    prometheus监控es集群
    es索引调优
    ES中Refresh和Flush的区别
    网络服务器技术Apache与Nginx,IIS的不同
    shell里/dev/fd与/proc/self/fd的区别
    常用抓包工具
    Ubuntu Kubuntu Xubuntu Lubuntu Dubuntu Mythbuntu UbuntuBudgie区别
    Android的Looper.loop()消息循环机制
    申请读写sd卡权限shell
  • 原文地址:https://www.cnblogs.com/liaoxiaolao/p/9593645.html
Copyright © 2020-2023  润新知