• Java Socket 编程 Socket与ServerSocket


    Java Socket 编程 Socket与ServerSocket

    1.引言

    有一个夜店(ServerSocket),你是嫖客(socket),晚上6点夜店进入营业状态,夜店正在阻塞等客户,你一进来,夜店马上安排一个小姐(server.accept()的client)与你激情对接,你向小姐输出就是你调用(outputStream),你吸入小姐精华是你调用(inputStream),你吸入小姐精华的时候得有小姐在向你输出(outputStream)

    1.1 ServerSocket类

       创建一个ServerSocket类,同时在运行该语句的计算机的指定端口处建立一个监听服务,如:
    
        ServerSocket MyListener=new ServerSocket(600);
    
        这里指定提供监听服务的端口是600,一台计算机可以同时提供多个服务,
        为了随时监听可能的Client请求,执行如下的语句:
    
        Socket LinkSocket=MyListener.accept();
    
    该语句调用了ServerSocket对象的accept()方法,这个方法的执行
    直到捕捉到一个来自Client端的请求,并返回一个用于
    此后Server程序只要向这个Socket对象读写数据,就可以实现
    向远端的Client读写数据。结束监听时,关闭ServerSocket对象:
    
         Mylistener.close();
    

    1.2 Socket类

        当Client程序需要从Server端获取信息及其他服务时,应创建一个
        Socket对象:
    
            Socket MySocket=new Socket(“ServerComputerName”,600);
    
        Socket类的构造函数有两个参数,第一个参数是欲连接到的Server计
        算机的主机地址,第二个参数是该Server机上提供服务的端口号。
    
        Socket对象建立成功之后,就可以在Client和Server之间
        建立一个连接,并通过这个连接在两个端点之间传递数据。利用Socket类的方法
        getOutputStream()和getInputStream()分别获得
        向Socket读写数据的输入/输出流,最后将从Server端读取的数据重新返还到Server端。
    
        当Server和Client端的通信结束时,可以调用Socket类的close()方法关闭Socket,拆除连接。
    
        ServerSocket 一般仅用于设置端口号和监听,真正进行通信的是服务器端
        的Socket与客户端的Socket,在ServerSocket 进行accept之后,就将主动权转让了。
    

    1.3 服务器端程序设计

    在服务器端,利用ServerSocket类的构造函数
    
        ServerSocket(int port)  
    
    创建一个ServerSocket类的对象,port参数传递端口,这个端口
    就是服务器监听连接请求的端口,如果在这时出现错误  
    将抛出IOException异常对象,否则将创建ServerSocket对象并开始准备接收连接请求。
    服务程序从调用  
    
        ServerSocket的accept()  
    
    方法开始,直到连接建立。在建立连接后,accept()返回一个最近创建的Socket对象,该Socket对象  
    绑定了客户程序的IP地址或端口号。
    

    1.4 客户端程序设计

      当客户程序需要与服务器程序通信时,需在客户机创建一个Socket对象。  
      Socket类有构造函数Socket(InetAddress addr,int port)和Socket(String host,intport)  
      两个构造函数都创建了一个基于Socket的连接服务器端流套接字的流套接字。对于第一个InetAd-dress子类对象,
      通过addr参数获得服务器主机的IP地址,对于第二个函数host参数包被分配到InetAddress对象中,  
      如果没有IP地址与host参数相一致,那么将抛出UnknownHostException异常对象。
      两个函数都通过参数port获得服务器的端口号。假设已经建立连接了,网络API将在客户端基于Socket的流套接字中  
      捆绑客户程序的IP地址和任意一个端口号,否则两个函数都会抛出一个IOException对象。
      如果创建了一个Socket对象,那么它可通过get-InputStream()方法从服务程序获得输入流读传送来的信息,  
      也可通过调用getOutputStream()方法获得输出流来发送消息。  
      在读写活动完成之后,客户程序调用close()方法关闭流和流套接字。     
    

    1.6 代码

    服务器端代码:

    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    public class Myserver {
    //建立ServerSocket,并设置其端口号
        private ServerSocket ss;
    
        public static final int port=8962;
    
        public Myserver(){
    
        try{
    
            ss=new ServerSocket(port);
    
        }catch(IOException e){
    
            e.printStackTrace();
            }
    
        }
        public void setConnection() throws IOException{
       //建立服务器端的Socket
        Socket s;
        OutputStream os;
        try{ //ServerSocke.accept()t返回一个Socket对象
            s=ss.accept();
            os=s.getOutputStream();
            os.write("hello".getBytes());
            os.close();
            s.close();
        }catch(IOException e){
    
            e.printStackTrace();
            }
    
        }
    
        public static void main(String[] args) throws IOException {
    
            Myserver ms=new Myserver();
            ms.setConnection();
    
        }
    }
    

    客户端代码:

        import java.io.BufferedReader;
        import java.io.IOException;
        import java.io.InputStream;
        import java.io.InputStreamReader;
        import java.net.Socket;
        public class Myclient {
            public static final String IP="172.16.221.134";
            public static final int port=8962;
            private Socket s;
            public Myclient() throws IOException{
            try{
               s=new Socket(IP,port);
    
            }catch(IOException e){
    
                e.printStackTrace();
                }
            }
    
            public void setConnection()throws IOException{
    
                InputStream is;
    
            try{
                is=s.getInputStream();
                BufferedReader br=new BufferedReader(new InputStreamReader(is));
    
                System.out.println(br.readLine());
    
            }catch(IOException e){
    
                e.printStackTrace();
                }  
             }
        public static void main(String args[]) throws IOException{
    
           Myclient mc=new Myclient();
           mc.setConnection();
    
            }
        }
    
  • 相关阅读:
    安卓app_sl3_18_19列表视图
    安卓app_sl3_17列表选择框Spinner
    安卓app_sl3_15复选框按钮示范
    eclipse如何新建安卓app项目程序
    安卓app_sl3_21日期拾取器,为时间拾取器设置监听器
    eclipse 安卓app开发环境搭建
    android从入门到精通
    安卓app_sl3_16图像视图线性布局
    安卓app_sl3_22计时器_显示当前时间_系统时间
    二叉树及其三种遍历
  • 原文地址:https://www.cnblogs.com/bishi/p/5699023.html
Copyright © 2020-2023  润新知