socket

Posted 一路晨光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了socket相关的知识,希望对你有一定的参考价值。

Java Scoket编程

Socket用于网络连接,其中封装了主机的名称,IP地址,端口号等信息。使用IO进行读写数据。

一、网络连接常用的模型:

 1、C/S模式:Client/Server客户端对服务器端(QQ)

在C/S模式下,客户向服务器发出服务请求,服务器接收请求后,提供相应的服务。

客户端部分:为每个用户所专有的,负责执行前台功能。

服务器部分:由多个用户共享的信息与功能,招待后台服务。

优点:

B/S模式:浏览器/服务器模式,是一种特殊的C/S结构。

统一了客户端:浏览器

统一了通信协议:http协议

二、连接步骤

  ServerSocket运行在服务端,Socket运行在客户端。

  连接步骤:

  1、创建ServerSocket

      2、创建客户端Socket

      3、打开输入输出流

      4、进行读写操作达到通信的目的

      5、关闭连接

     

三、Socket核心API

 1、客户端

    使用 new Socket(ip, port) 连接到服务器

    如果连接成功, 就创建了Socket 对象,包含两个流(in, out)

             InputStream in = s.getInputStream;//in 代表服务端到客户端的流

                    OutputStream out = s.getOutputStream();//out 代表客户端到服务器的流

    如果连接失败, 就抛出异常,连接失败:

    1)服务器没有运行

    2)IP错误

    3)Port 错误

 2、服务端    

      ServerSocket ss = new ServerSocket(8888);

      Socket s = ss.accept();

      Accept()引起当前线程IO Block,等待客户端的连接。

      如果连接成功就返回Socket实例s,s代表客户端的连接,s中包含流属性in和out

      In代表客户端发送来的信息,out代表向客户端输出的信息。

 

案例:

(1)单个客户端连接到服务器

 服务器端

             public static void main(String[] args) {

            try {

                //1、绑定监听端口,tcp协议端口号为8888

                ServerSocket server=new ServerSocket(8888);

                //2、等待客户的连接

                //accept方法是I/O阻塞方法,等待客户的连接,直到有客户端连接进来再继续执行

                Socket socket=server.accept();

                System.out.println("有客户连接进来....");

                //3、Socket对象socket中包含两个流(in,out)

                PrintWriter pw=new PrintWriter(

new OutputStreamWriter(socket.getOutputStream(),"gbk"));

                pw.println("客户你你好");

                pw.flush();//刷出缓存

                BufferedReader reader=new BufferedReader(

new InputStreamReader(socket.getInputStream()));

                String str=reader.readLine();

//I/O阻塞的方法,等客户说话,不说话不往下执行

                System.out.println("客户说:"+str);

                pw.close();

                reader.close();

            } catch (IOException e) {

                //会出现端口号被占用的异常

                e.printStackTrace();

            }

}

客户端

public static void main(String[] args) {

            try {

                Socket socket=new Socket("localhost",8888);

                InputStream in=socket.getInputStream();

                System.out.println(in.getClass());

                //读

                BufferedReader reader=new BufferedReader(

new InputStreamReader(socket.getInputStream()));

                String str=reader.readLine();

                System.out.println("女神说:"+str);

                //写

                PrintWriter pw=new PrintWriter(

new OutputStreamWriter(socket.getOutputStream(),"gbk"));

                pw.println("我说:你好");

                pw.flush();//刷出缓存

                pw.close();

                reader.close();

            } catch (IOException e) {

                e.printStackTrace();

            }

}

(2)多线程

 看案例

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

以上是关于socket的主要内容,如果未能解决你的问题,请参考以下文章

socket通信

java实例检查端口是否被占用

网络通信与Socket

分布式理论,架构设计Socket和IO模型

分布式理论,架构设计Socket和IO模型

android做一个简单上传文件的功能,socket连接问题