-
Java连载125-UDP、TCP概念以及ServerSocket示例
一、UDP和TCP
1.UDP(user datagram protocol)用户数据报协议;
TCP(transmission control protocol)传输控制协议。
2.UDP特性:UDP是无连接通信协议,即在数据传输的时候,数据的发送端和接收端不建立逻辑连接 ,优点:消耗资源小,通信效率高,但是不建议传输重要数据,因为有可能会丢包,并且两端是没有反馈的,不知道是否已经接收到了数据。
3.TCP特性:TCP是面向连接的通信协议,即在传输数据之前先在发送端和接收端建立逻辑连接,然后再进行传输数据,它提供了两台计算机之间可靠、无差错的数据传输。“三次握手”。如果下载数据,一定要用这个协议,因为如果丢包可能会导致下载的数据包打不开。
4.TCP通信两端需要Socket对象。两种协议的差别在于:(1)UDP中只有发送端和接收端,不区分客户端和服务器端。TCP则严格区分。
通信时,只能客户端先向服务器端发送请求,并且服务器端必须要事先启动,不可以主动联系客户端,只能等待被连接。
5.ServerSocket类,表示服务器端;Socket类用于表示客户端。
6.通信过程:
(1)先创建一个ServerSocket对象,相当于开启一个服务,等待客户端的连接;
(2)Socket对象使用该对象向服务器端发送请求;
(3)服务器端响应之后,两者才建立连接。
二、ServerSocket类
1.各种构造方法使用方法:
(1)ServerSocket()
使用该构造方法在创建ServerSocket对象时并没有绑定端口号,这样的对象创建的服务器端没有监听任何端口,不能直接使用,还需要继续调用bind(SocketAddress endpoint)方法将其绑定到指定的端口号上,才可以正常使用。
(2)ServerSocket(int port)
使用该构造方法在创建ServerSocket对象时可以将其绑定到一个指定的端口号上(参数port就是端口号)。端口号可以指定为0,此时系统就会分配一个还没有被其他网络程序使用的端口号,由于客户端需要根据指定的端口号来访问服务器端程序,因此端口号随机分配的情况并不多见,通常会让服务器端程序监听一个指定的端口号。
(3)ServerSocket(int port,int backlog)
该构造方法是在第二个构造方法的基础上增加了backlog参数,该参数用于指定在服务器忙时可以与之保持连接请求的等待客户数量,如果没有指定参数,默认50;
(4)ServerSocket(int port,int backlog,InetAddress bindAddr)
该构造方法实在第三个构造方法基础上增加了bindAddr参数,该参数用于指定相关的IP地址,该构造方法适用于计算机有多块网卡和多个IP的情况,使用时可以明确指定ServerSocket在哪块网卡或IP地址上等待客户链接请求。
常用方法:
方法 |
说明 |
Socket accept() |
用于等待客户端的连接,在客户端连接之前会一直处于阻塞状态,如果有客户端连接,就会返回一个与之对应的Socket对象。 |
InetAddress getInetAddress |
用于返回一个InetAddress对象,该对象中封装了ServerSocket绑定的IP地址。 |
Boolean isClosed() |
用于判断ServerSocket对象是否为关闭状态,如果是关闭状态则返回true,反之返回false |
void bind(SocketAddress endpoint) |
用于将ServerSocket对象绑定到指定的IP地址和端口号,其中参数endpoint封装了IP地址和端口号。 |
package com.bjpowernode.java_learning; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class D125_ServerSocket { public static void main(String[] args) { ServerSocket server_socket = null; Socket socket = null; DataInputStream in = null; DataOutputStream out = null; int port = 5050; try { //创建绑定端口的服务器端Socket server_socket = new ServerSocket(port); }catch (IOException e) { System.out.println(e); } try { System.out.println("服务器启动!"); socket = server_socket.accept(); //监听并接受此Socket的连接,此方法在连接之前是处于阻塞状态。 in = new DataInputStream(socket.getInputStream());//创建输入流 out = new DataOutputStream(socket.getOutputStream());//创建输出流 String str = in.readUTF();//从输入流读取字符串,读取结束之前处于阻塞状态。 System.out.println("客户机发送过来的信息是:"+str); out.writeUTF("你好,我是服务器B");//向输出流写入字符串 }catch(Exception e) { System.out.println(e); } finally { try { //关闭网络连接 out.close(); in.close(); socket.close(); server_socket.close(); }catch (Exception e) { } } } }
通过输入流对象读取客户端发来的内容,通过输出流对象向客户端发送相应的内容。
三、源码
D125_ServerSocket.java
https://github.com/ruigege66/Java/blob/master/D125_ServerSocket.java
出 处:https://www.cnblogs.com/ruigege0000/p/13196977.html