传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。
在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。
ServerSocket:此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。服务器套接字的实际工作由SocketImpl类的实例执行。应用程序可以更改创建套接字实现的套接字工厂来配置它自身,从而创建适合本地防火墙的套接字。
Socket:此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器之间的通信端点。套接字的实际工作由SocketImpl类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。
SocketAddress:此类表示不带任何协议附件的Socket Address。作为一个抽象类,应通过特定的、协议相关的实现为其创建子类。它提供不可变对象,供套接字用于绑定、连接或用作返回值。
TCP服务器端实现
package com.xieyincai.net; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class SimpleTCPServer { private final static int PORT = 8000; public static void main(String[] args) { // TODO Auto-generated method stub ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(PORT); while(true) { Socket socket = serverSocket.accept(); OutputStream out = socket.getOutputStream(); InputStream in = socket.getInputStream(); byte[] buffer = new byte[4096]; int length = in.read(buffer); String data = new String(buffer, 0, length, "UTF-8"); System.out.println("CLIENT:\t" + socket.getInetAddress() + " : " + socket.getPort() + "\t" + data); data = "ECHO:\t" + data; out.write(data.getBytes("UTF-8")); out.flush(); socket.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { serverSocket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
TCP客户端实现
package com.xieyincai.net; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; public class SimpleTCPClient { private final static String HOSTNAME = "localhost"; private final static int PORT = 8000; public static void main(String[] args) { // TODO Auto-generated method stub Socket socket = new Socket(); try { SocketAddress address = new InetSocketAddress(HOSTNAME, PORT); socket.connect(address); OutputStream out = socket.getOutputStream(); InputStream in = socket.getInputStream(); String data = String.valueOf(System.nanoTime()); System.out.println(data); out.write(data.getBytes("UTF-8")); out.flush(); byte[] buffer = new byte[4096]; int length = in.read(buffer); String result = new String(buffer, 0, length, "UTF-8"); System.out.println(result); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
服务器端输出:
CLIENT: /127.0.0.1 : 55683 59297620405401 CLIENT: /127.0.0.1 : 55716 59304171339613 CLIENT: /127.0.0.1 : 55738 59308897235198
客户端输出:
59308897235198 ECHO: 59308897235198