基于TCP的Socket编程

     TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一种面向连接(连接导向)的、可靠的、基于字节流运输层Transport layer)通信协议。在使用TCP协议传输数据,接收端收到的是一个和发送端完全一样的数据流。发送端和接收端必须建立联系,以便在TCP协议基础上进行通讯,其端口之间建立连接,一般都是使用Socket套接字,当服务的Socket等待服务请求(即建立连接)时,客户端的Socket可以要求建立连接,一旦连接起来就可以双向传输数据。

一:网络套接字Socket 

Socket作"套接字",是计算机网络通讯的基本技术之一,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。如今大多数基于网络的软件(如:浏览器、即时通讯工具、P2P下载)都是基于Socket实现的,Socket可说为是一种针对网络的抽象应用,通过它可以针对网络读写数据。

根据TCP协议和UDP协议的不同,在网络编程方面存在两种 Socket  一个是面向字节流、一个是面向报文的。
对于Java Socket编程有两个概念,一个是ServerSocket另一个是Socket ,服务器和客户端通过Socket 建立连接,首先ServerSocket将在服务端监听某个端口,当发现客户端有Socket试图连接它时,它会接收Socket连接请求,同时在服务端建立一个对应的Socket与之进行通信,这样服务器和客户端就各有一个Socket。
应用通讯的Socket需要一个对应的通讯(IP)地址,正在这个地址上Server提供一系列服务,就需要一个窗口和一个对应的端口号(Port),端口号是一个十六位的二进制数,范围为0~65535。

二:Socket

Socket类常用构造方法如下

Socket(String host, int port, InetAddress localAddr, int localPort) 创建一个套接字并将其连接到指定远程主机上的指定远程端口。

  Socket(InetAddress address, int port)     创建一个流套接字并将其连接到指定主机上的指定端口号。
Socket(String host, int port)     创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
创建一个Socket对象并赋初值,远程连接 IP为192.268.10.28,端口号为3306.
 Socket mysocket=new Socket("192.168.10.28",3306);

 InetAddress getInetAddress() 返回套接字连接的地址。 
    InputStream getInputStream()   返回此套接字的输入流。 
int getLocalPort() 返回此套接字绑定到的本地端口。 
SocketAddress getLocalSocketAddress()   返回此套接字绑定的端点的地址,如果尚未绑定则返回 null
 OutputStream getOutputStream()  返回此套接字的输出流。 

 int getPort()  返回此套接字连接到的远程端口。 

 boolean isBound()   返回套接字的绑定状态。 
 boolean isClosed() 返回套接字的关闭状态。 
 boolean isConnected() 返回套接字的连接状态。 
 void connect(SocketAddress endpoint, int timeout)    将此套接字连接到服务器,并指定一个超时值。 
 void close()  关闭此套接字。 

使用Socket类的步骤如下:

基于TCP(面向连接)的socket编程,分为客户端和服务器端。
客户端的流程如下:
(1)创建套接字(socket)用服务器的IP地址,和端口号实例化Socket对象
//创建客户端的Socket对象
		Socket s = new Socket("192.168.10.1", 22222) ;
(2)向服务器发出连接请求:调用connect()方法,连接到服务器上。
(3)获得Socket()上的流,把流封装进BufferedReader/PrintWriter的实例,然后进行读写。
//使用字符缓冲输入流的录入方式
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) ;
		
(4)利用 Socket提供的GetInputStream/OutInputStream方法,通过IO流对象,向服务器发送数据。
//封装通道的流(s.getOutputStream())
		BufferedWriter bw = 
				new BufferedWriter(new OutputStreamWriter(s.getOutputStream())) ;
(5)关闭打开的流和 Socket
//释放资源对象
//		bw.close();
		s.close();

 ServerSocket

    在客户/服务器通讯模式中,服务器端需要创建能够接听特定端口的ServerSocket类对象,而ServerSocket负责监听来自客户端的服务请求,并根据服务请求运行相应的程序。

构造方法摘要 
ServerSocket() 
          创建非绑定服务器套接字。 
ServerSocket(int port) 
          创建绑定到特定端口的服务器套接字。 
ServerSocket(int port, int backlog) 
          利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。 
ServerSocket(int port, int backlog, InetAddress bindAddr) 
          使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。 
port表示端口,为0则表示任何空闲端口,
backlog指定服务器满足的最长连接队列,满则拒绝连接。
bindAddr为null则表示接受任何/本地连接
例如下面语句:
//创建服务器端的Socket对象
		ServerSocket ss = new ServerSocket(22222) ;
此语句创建了一个 ServerSocket对象ss,并且服务绑定在端口22222上
	ServerSocket ss = new ServerSocket(22222,10) ;
此语句创建了一 ServerSocket对象ss,并且服务绑定在端口22222上。最长连接队列为10.

方法摘要 
 Socket accept() 
          侦听并接受到此套接字的连接。 
 void bind(SocketAddress endpoint) 
          将 ServerSocket 绑定到特定地址(IP 地址和端口号)。 
 void bind(SocketAddress endpoint, int backlog) 
          将 ServerSocket 绑定到特定地址(IP 地址和端口号)。 
 void close() 
          关闭此套接字。 
 ServerSocketChannel getChannel() 
          返回与此套接字关联的唯一 ServerSocketChannel 对象(如果有)。 
 InetAddress getInetAddress() 
          返回此服务器套接字的本地地址。 
 int getLocalPort() 
          返回此套接字在其上侦听的端口。 
 SocketAddress getLocalSocketAddress() 
          返回此套接字绑定的端点的地址,如果尚未绑定则返回 null。 
服务器端的流程如下:
(1)创建套接字(socket)
//创建服务器端的Socket对象
		ServerSocket ss = new ServerSocket(22222) ;
(2)将套接字绑定到一个本地地址和端口上(bind)
(3)将套接字设为监听模式,准备接收客户端请求(listen)
(4)等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)
//监听客户端连接
		Socket s = ss.accept() ;
(5)用返回的套接字和客户端进行通信(send/recv)
(6)返回,等待另一个客户请求。
(7)关闭打开的流和Socket。

猜你喜欢

转载自blog.csdn.net/qq_41141896/article/details/80572652