TCP协议是面向链接、保证高可靠性(数据无丢失、数据无失序、数据无错误、数据无重复到达)传输层协议。编程
TCP经过三次握手创建链接,通信完成时要拆除链接,因为TCP是面向链接的因此只能用于端到端的通信。服务器
Socket能够说是一种针对网络的抽象,应用经过它能够来针对网络读写数据。根据TCP协议和UDP协议的不一样,在网络编程方面就有面向两个协议的不一样socket,一个是面向字节流的一个是面向报文的。网络
对socket的自己组成却是比较好理解。既然是应用经过socket通讯,确定就有一个服务器端和一个客户端。因此它必然就包含有一个对应的IP地址。另外,在这个地址上server要提供一系列的服务,因而就须要有一系列对应的窗口来提供服务。因此就有一个对应的端口号(Port)。socket
Socket服务端测试
Server端所要作的事情主要是创建一个通讯的端点,而后等待客户端发送的请求。典型的处理步骤以下:spa
1. 构建一个ServerSocket实例,指定本地的端口。这个socket就是用来监听指定端口的链接请求的。server
2.重复以下几个步骤:htm
a. 调用socket的accept()方法来得到客户端的链接请求。经过accept()方法返回的socket实例,创建了一个和客户端的新链接。ci
b.经过这个返回的socket实例获取InputStream和OutputStream,能够经过这两个stream来分别读和写数据。get
c.结束的时候调用socket实例的close()方法关闭socket链接。
服务端示例代码:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
public
class
TestTCPSend { public static void main( String [] args) { ServerSocket serverSocket=null; Socket socket=null; String msg= "hello client,I am server.." ; try { //构造ServerSocket实例,指定端口监听客户端的链接请求 serverSocket= new ServerSocket( 8080 ); //创建跟客户端的链接 socket=serverSocket.accept(); //向客户端发送消息 OutputStream os=socket.getOutputStream(); os.write(msg.getBytes()); InputStream is=socket.getInputStream(); //接受客户端的响应 byte [] b= new byte [ 1024 ]; is.read(b); System.out.println( new String (b)); } catch (IOException e) { e.printStackTrace(); } finally { //操做结束,关闭socket try { serverSocket.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } |
Socket客户端
客户端的请求过程稍微有点不同:
1.构建Socket实例,经过指定的远程服务器地址和端口来创建链接。
2.经过Socket实例包含的InputStream和OutputStream来进行数据的读写。
3.操做结束后调用socket实例的close方法,关闭。
服务端示例代码:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public
class
TestTCPReceive { public static void main( String [] args) { Socket socket=null; try { //对服务端发起链接请求 socket= new Socket( "localhost" , 8080 ); //接受服务端消息并打印 InputStream is=socket.getInputStream(); byte b[]= new byte [ 1024 ]; is.read(b); System.out.println( new String (b)); //给服务端发送响应信息 OutputStream os=socket.getOutputStream(); os.write( "yes,I have received you message!" .getBytes()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |
运行测试:
先运行服务端代码,以后运行客户端。
以后能够分别在客户端和服务端看到对应的消息。