Java-Socket

来源:互联网 发布:淘宝网衬衫连衣裙女 编辑:程序博客网 时间:2024/05/19 16:51

Socket

Socket介绍及其通信模型

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
建立网络通信连接至少要一对端口号(socket)。
socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
Socket的英文原义是“孔”或“插座”。在计算机网络通信中,取后一种意思。通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。
在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。
这里写图片描述

Socket通信实现(单线程下)

  • 服务器端 Server
    1.指定一个端口,实例化一个ServerSocket对象。
    服务器就可以用这个端口监听从客户端发来的连接请求。
    2.使用ServerSocket的accept()方法,等待端口发来的请求。
    3.利用accept方法返回的客户端的Socket对象,进行读写IO的操作
    4.关闭流,socket对象
package tcp;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.ServerSocket;import java.net.Socket;public class Server {    public static void main(String[] args) throws IOException {        //创建一个服务器端的ServerSocket对象ss,指定端口,并监听此端口        ServerSocket ss = new ServerSocket(8001);        //使用accept()监听,等待客户端链接        Socket s = ss.accept();        //获取输入流,获取客户端发送的信息        InputStream is = s.getInputStream();        InputStreamReader isr = new InputStreamReader(is,"UTF-8");        BufferedReader br = new BufferedReader(isr);        String str =null;        while((str = br.readLine())!=null){            System.out.println(str);        }        //关闭资源        br.close();        isr.close();        is.close();        s.close();        ss.close();    }}
  • 客户端 Client
    1.使用服务器端IP地址和端口,创建客户端的Socket对象。
    2.使用Socket对象获取消息内容,对其进行操作
    3.关闭资源
package tcp;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.Socket;public class Client{    public static void main(String[] args) {        try {            //这里做测试用,目的地址是自己的IP地址            Socket s = new Socket("localhost", 8001);            //使用Socket对象            OutputStream os = s.getOutputStream();            OutputStreamWriter osw = new OutputStreamWriter(os, "UTF-8");            PrintWriter pw = new PrintWriter(osw);            pw.write("你好呀\n");            pw.write("123\n");            pw.write("Hello\n");            pw.close();            osw.close();            os.close();            s.close();        } catch (Exception e) {            e.printStackTrace();        }    }}