gaojingsong 阅读(53) 评论(0)

socket网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

 

Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。

 

 

Socket连接过程

根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。

(1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。

(2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

(3)连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。


 通信原理

 

import java.io.IOException;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

 

public class SocketService {

// 搭建服务器端

public static void main(String[] args) throws IOException {

try {

ServerSocket server = null;

server = new ServerSocket(5209);

// b)指定绑定的端口,并监听此端口。

System.out.println("服务器启动成功");

// 创建一个ServerSocket在端口5209监听客户请求

Socket socket;

PrintWriter writer ;

while(true){

socket = server.accept();

// 2、调用accept()方法开始监听,等待客户端的连接

// 使用accept()阻塞等待客户请求,有客户

// 请求到来则产生一个Socket对象,并继续执行

// 由Socket对象得到输入流,并构造相应的BufferedReader对象

writer = new PrintWriter(socket.getOutputStream());

// 如果该字符串为 "bye",则停止循环

writer.println(getTable());

// 向客户端输出该字符串

writer.flush();

// 5、关闭资源

//writer.close(); 

            }

//            writer.close(); // 关闭Socket输出流

//socket.close(); // 关闭Socket

//server.close(); // 关闭ServerSocket

            } catch (Exception e) {// 出错,打印出错信息

e.printStackTrace();

}

}

 

public static String getTable(){

StringBuffer sb = new StringBuffer();

sb.append("<html>");

sb.append("<body>");

sb.append("<hr color='red'>这个表格有一个标题,以及粗边框:</hr>");

sb.append("<table style='border:1px solid #ff0000;width='1600px';border-collapse:collapse;'>");

sb.append("<caption>我的标题</caption>");

sb.append("<tr>");

sb.append(" <td style='border:1px #0066ff solid;' >100</td>");

sb.append("<td style='border:1px #0066ff solid;' >200</td>");

sb.append("<td style='border:1px #0066ff solid;' >300</td>");

sb.append("</tr>");

sb.append("<tr>");

sb.append("<td style='border:1px #0066ff solid;' >400</td>");

sb.append("<td style='border:1px #0066ff solid;' >500</td>");

sb.append("<td style='border:1px #0066ff solid;' >600</td>");

sb.append("</tr>");

sb.append("</table>");

sb.append("</body>");

sb.append("</html>");

return sb.toString();

}

}