网络基础

    xiaoxiao2021-03-26  34

    下面介绍的内容仅适用于TCP(传输控制协议)网络协议。Java平台另外还支持所谓的UDP(用户数据报协议)协议,该协议可以用于发送数据包(也称为数据报),它所需付出的开销要比TCP少得多。UDP有一个重要的缺点:数据包无需按照顺序进行传递,它们甚至可能在传输过程中全部丢失。UDP要求数据包的接受者对它们进行排序,并请求发送者重新发送那些丢失的数据包。UDP比较适合于那些可以忍受数据包丢失的应用,例如用于音频流和视频流的传输,或者用于连续测量的应用领域。

    Socket Socket(String host, int port)构建一个套接字,用来连接给定的主机和端口。 InputStream getInputStream() OutputStream getOutputStream() 获取可以从套接字中读取数据的流,以及可以向套接字写出数据的流。 套接字超时

    从套接字读取信息时,在可以访问数据之前,读操作将会被阻塞。如果此时主机不可达,那么应用将要等待很长的时间,并且因为受底层操作系统的限制而最终会导致超时。对于不同的应用,应该确定合理的超时值。然后调用setSoTimeout方法设置这个超时值(单位:毫秒)。如果已经为套接字设置了超时值,并且之后的读操作和写操作在没有完成之前就超过了时间限制,那么这些操作就会抛出SocketTimeoutException异常。 Socket(String host,int port)会一直无限期地阻塞下去,直到建立了到达主机的初始连接为止。

    Socket a = new Socket(); a.connect(new InetSocketAddress("",80), 10);这样就解决了前面一直阻塞的问题 Socket()创建一个还未被连接的套接字。 void connect(SocketAddress address) 将该套接字连接到给定的地址。 void connect(SocketAddress address, int timeoutInMilliseconds) 将套接字连接到给定的地址。如果在给定的时间内没有响应,则返回。 void setSoTimeout(int timeoutInMilliseconds) 设置该套接字上读请求的阻塞时间。如果超出给定时间,则抛出一个InterruptedIOException异常。 boolean isConnected() 如果该套接字已被连接,则返回true。 boolean isClosed() 如果套接字已经被关闭,则返回true。 因特网地址

    因特网地址是指用一串数字表示的主机地址,它由4个字节组成, IPv6规定为16个字节,比如132.163.4.102。通常,不用过多考虑因特网地址的问题。但是,如果需要在主机名和因特网地址之间进行转换时,可以使用InetAddress类。 静态的getByName方法可以返回代表某个主机的InetAddress对象。

    InetAddress ia = InetAddress.getByName("localhost"); 然后,可以使用getAddress方法来访问这些字节。 System.out.println(ia.getHostName()); byte[] b = ia.getAddress(); 可以通过调用getAllByName方法来获得所有主机 InetAddress[] ia = InetAddress.getAllByName("localhost"); 以使用静态的getLocalHost方法来得到本地主机的地址 InetAddress a =InetAddress.getLocalHost(); static InetAddress getByName(String host) static InetAddress[] getAllByName(String host) 为给定的主机名,创建一个InetAddress对象,或者一个包含了该主机名所对应的所有因特网地址的数组。 static InetAddress getLocalHost()为本地主机创建一个InetAddress对象。 byte[] getAddress()返回一个包含数字型地址的字节数组。 String getHostAddress()返回一个由十进制数组成的字符串,各数字间用圆点符号隔开,例如, “132.163.4.102”。 String getHostName()返回主机名 实现服务器

    使用ServerSocket类用于建立一个套接字。

    ServerSocket ss = new ServerSocket(int port); Socket s = ss.accept();然后创建输入输出流读取内容。

    ServerSocket(int port)创建一个监控端口的服务器套接字。 Socket accept() 等待连接。该方法阻塞(即,使之空闲)当前线程直到建立连接为止。该方法返回一个套接字对象,程序可以通过这个对象与连接中的客户端进行通信。 void close()关闭服务器套接字。 客户端 public static void main(String[] args) throws UnknownHostException, IOException { Socket a = new Socket("127.0.0.1",8189); InputStream is = a.getInputStream(); OutputStream os = a.getOutputStream(); PrintWriter pw = new PrintWriter(os); BufferedReader bf = new BufferedReader(new InputStreamReader(is)); Scanner scanner = new Scanner(System.in); String s; while((s=bf.readLine())!=null){ System.out.println(s); pw.println(scanner.nextLine()); pw.flush(); } 服务器 ServerSocket ss = new ServerSocket(8189); Socket s = ss.accept(); InputStream is = s.getInputStream(); OutputStream os = s.getOutputStream(); PrintWriter pw = new PrintWriter(os); BufferedReader bf = new BufferedReader(new InputStreamReader(is)); pw.println("hello,enter bye to close"); pw.flush(); boolean flag=true; String input; while((input=bf.readLine())!=null&& flag){ pw.println(input); if(input.equals("bye")){ flag=false; } pw.flush(); } s.close();

    转载请注明原文地址: https://ju.6miu.com/read-660800.html

    最新回复(0)