百度百科:
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原义那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。
Client
public class JavaClient {
public static void main(String [] args) throws InterruptedException, IOException
{
//创建socket
InetSocketAddress addr = new InetSocketAddress("127.0.0.1", 8888);
Socket sock = new Socket();
//连接服务器
sock.connect(addr);
//获得输入输出流
BufferedReader is = new BufferedReader(new InputStreamReader(sock.getInputStream()));
PrintWriter os = new PrintWriter(sock.getOutputStream());
//发送数据
os.write("{\"type\": 0, \"taskid\":\"001\"}");
os.flush();
//关闭输出流
sock.shutdownOutput();
//获取接收到的数据
String s = is.readLine();
System.out.println("接收:" + s);
//关闭流
os.close();
is.close();
sock.close();
}
}
Server
public class JavaServer {
/**
* Socket服务端
*/
public static void main(String[] args) {
try {
ServerSocket serverSocket=new ServerSocket(8888);
System.out.println("服务端已启动,等待客户端连接..");
//侦听并接受到此套接字的连接,返回一个Socket对象
Socket socket=serverSocket.accept();
//获得输入输出流
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter os = new PrintWriter(socket.getOutputStream());
System.out.println("接收:" + is.readLine());
//发送:{"status":1, "msg":"success", "data":"hhhhhh"}
os.write("{\"status\":1, \"msg\":\"success\", \"data\":\"hhhhhh\"}");
os.flush();
socket.shutdownOutput();//关闭输出流
//关闭相对应的资源
os.close();
is.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}