套接字(socket)是通信的基石,套接字链接需要五个元素:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远程主机的 IP地址,远程主机的协议端口;
套接字(Socket)连接需要的三个步骤:1.服务器监听,2.客户端请求,3.连接确认;
套接字(Socket)连接的作用:应用层通过传输层进行通信时,TCP会遇到同时为多个应用程序提供并发服务的问题,多个TCP连接或多个应用程序可能会同时使用同一个协议端口传输数据。为了区分不同运用程序和连接,操作系统为应用程序和TCP/IP协议提供了套接字(Socket)接口应用层和传输层可以通过Socket接口,区分来自不同应用程序和网络通信的通信,实现数据传输的并发服务。
示例:
//server,本例服务器与客户端都在本机,使用8888端口,本地ip:127.0.0.1
Map<Socket,ObjectOutputStream> soosMap ;
Map<Socket,ObjectInputStream> sois;
ServerSocket ss = new ServerSocket(8888);
while(true){
Socket s = ss.accept();//socket通信是阻塞的,当没有接收到ClientSocket连接请求时,程序一直阻塞,不向下执行,直到收到连接请求
ObjectOutputStream oos = new ObjectOutputStream();
soosMap.put(s,oos);//为每一个客户端产生一个输出流,进行通信,同样的,客户端也有一个输入流用于通信;在客户端也创建一个输入流来接受服务器发出的消息
new AcceptMessageThread(s).start();//消息监听线程一直监听客户端,等待消息通信;
}
Thread AcceptMessageThread extends Thread{
private Socket s;
public AcceptMessageThread(Socket s){
this.s = s;
}
public void run(){
ObjectInputStream ois = new ObjectInputStream(s.getInputStream);//为每一个socket连接对象创建一个对象输入流来接收客户端的通信消息,在客户端也同样创建一个输出流来发送消息
while(true){//保持监听
Message msg = ois.readObject();
}
}
}
//Client
private Socket s;
private ObjectOutputStream oos;
private ObjectInputStream ois;
private void initClient() {
while(true){
try {
s =new Socket("127.0.0.1",8888);
oos = new ObjectOutputStream(s.getOutputStream());
ois = new ObjectInputStream(s.getInputStream());
break;
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}