Socket编程

TCP:Transmission Control Protocol

IP: Internet Protocol

五层模型:物理层、数据链路层、网络层、传输层、应用层。

http:80 ftp:21 telnet:23

针对网络通信不同层次,Java提供的网络功能有四大类:

1、InetAddress:用于标识网络上的硬件资源,标示互联网协议地址(IP地址)。

         没有提供构造方法,可以通过静态方法返回InetAddress对象。

2、URL:统一资源定位符。由协议名和资源名组成。java.net包中提供了URL类操作URL。

3、Sockets

      基于TCP协议实现网络通信类

      客户端的Socket类

      服务端的ServerSocket类

     1、建立服务端侦听socket

     2、客户端创建连接socket向服务端发送请求

     3、服务端等待并接收连接请求

     4、接收请求后服务端创建连接socket

     5、服务端与客户端通信

     6、服务端和客户端分别关闭socket和相关资源

编程流程

     服务端:

     1、创建ServerSocket对象,绑定监听端口

      2、通过accept()方法监听客户端请求

      3、连接建立后,通过输入流读取客户端发送的请求信息

      4、通过输出流向客户端发送响应信息

      5、关闭响应的资源

       客户端:

       1、创建Socket对象,指明需要连接的服务器的地址和端口号

        2、建立连接后,通过输出流向服务器发送请求信息

        3、通过输入流获取服务器响应的信息

        4、关闭相关资源

     代码:

         服务端:

          public class Server{

                 public static void main(){

                          //创建ServerSocket对象,绑定监听端口

                          ServerSocket serverSocket = new ServerSocket(8888);//需捕获异常,这里省略

                          //通过accept()方法监听客户端请求,处于阻塞状态等待侦听

                          Socket socket = serverSocket.accept();

                          //获取输入流,并读取客户端信息

                          InputStream is = socket.getInputStream();

                          InputStreamReader isr = new InputStreamReader(is);

                          BufferedReader br = new BufferedReader(isr);

                           String info = null;

                           while((info=br.readLine())!=null){

                            //处理;

                             }

                             socket.shutdownInput();

                             //获取输出流响应客户端请求

                             OutputStream os = socket.getOutputStream();

                             PrintWriter pw = new PrintWriter(os);

                             pw.write("hdhdhdhhd");

                             pw.flush();

                             pw.close();

                              br.close();

                              isr.close();

                              is.close();

                              socket.close();

                              serverSocket.close();

                 }

           }

           客户端:

           public class Client{

                  public static void main(String[] args) throws UnknownHostException, IOException {
                            Socket socket = new Socket("localhost",8888);
                            OutputStream os = socket.getOutputStream();
                            PrintWriter pw = new PrintWriter(os);
                            pw.write("hahahhahahaha");
                            pw.flush();
                            socket.shutdownOutput();

                            InputStream is = socket.getInputStream();

                            BufferedReader br = new BufferedReader(new InputStreamReader(is));

                            String info = null;

                            while((info = br.readLine())!=null){

                                      System.out.println(info);

                            } 

                            br.close();

                            is.close();
                            pw.close();
                            os.close();
                            socket.close();
                          }   
                    }

           服务器与多客户端通信:

                    多线程实现方法

                     1、服务器创建ServerSocket,循环调用accept()等待客户端连接

                     2、客户端创建一个socket并请求和服务端连接

                     3、服务端接受客户端请求,创建socket与该客户建立专线连接

                     4、建立连接的两个socket在一个单独的线程上对话

                     5、服务端等待新的连接

               服务端创建专门处理的线程类

                      public class ServerThread extends Thread{

                                 Socket socket = null;

                                 public ServerThread(Socket socket){

                                          this.socket = socket;

                                 }

                                 public void run(){

                                            InputStream is = null;

                                            InputStreamReader isr = null;

                                            BufferedReader br =null;

                                            OutputStream os = null;

                                            PrintWriter pw =null;

                                            is = socket.getInputStream();

                                            isr = new InputStreamReader(is);

                                            br = new BufferedReader(isr);

                                            String info = null;

                                            while((info=br.readLine())!=null){

                                                   //处理;

                                             }

                                             socket.shutdownInput();

                                             //获取输出流响应客户端请求

                                             os = socket.getOutputStream();

                                             pw = new PrintWriter(os);

                                             pw.write("hdhdhdhhd");

                                             pw.flush();

                                             pw.close();

                                             br.close();

                                             isr.close();

                                             is.close();

                                             socket.close();

                                  }

                       }

               服务端main方法

                        public static void main(String[] args){

                                   ServerSocket serverSocket = new ServerSocket(8888);

                                    Socket socket = null;

                                    while(true){

                                             socket = serverSocket.accept();

                                             ServerThread serverThread = new ServerThread(socket);

                                              serverThread.start();

                                              InetAddress address = socket.getInetAddress();//获取客户端ip地址

                                     }

                        }

4、Datagram:使用udp协议,将数据保存在数据报中,通过网络进行通信。

                       DatagramPacket:数据报

                       DatagramSocket:端到端通信的类

               服务器端:

                      1、创建DatagramSocket,指定端口号

                      2、创建DatagramPacket

                      3、接收客户端发送的数据信息

                      4、读取数据

              客户端:

                      1、定义发送信息

                       2、创建DatagramPacket,包含将要发送的信息

                       3、创建DatagramSocket

                       4、发送数据

               代码:

               服务器端

                        public static void main(String[] args) throws UnknownHostException, IOException {
                                   DatagramSocket socket = new DatagramSocket(8800);
                                   byte[] data = new byte[1024];
                                   DatagramPacket packet = new DatagramPacket(data,data.length);
                                   socket.receive(packet);//此方法在接收数据报之前一直处于阻塞状态
                                   String info = new String(data,0,packet.getLength());
                                   System.out.println(info);

                                           /**
                                            * 响应客户端
                                            */
                                    InetAddress address = packet.getAddress();
                                    int port = packet.getPort();
                                    byte[] data2 = "hello".getBytes();
                                    DatagramPacket packet2 = new DatagramPacket(data2,data2.length,address,port);
                                    socket.send(packet2);
                                    socket.close();
                         }

               客户端

                        public static void main(String[] args) throws UnknownHostException, IOException {
                                    //1、服务器 的地址端口号数据
                                    InetAddress address = InetAddress.getByName("localhost");
                                    int port = 8800;
                                    byte[] data = "hahahhahhahahha".getBytes();
                                    //创建数据报。发送信息
                                    DatagramPacket packet = new DatagramPacket(data,data.length,address,port);
                                    DatagramSocket socket = new DatagramSocket();
                                    socket.send(packet);

                                    /*
                                    * 接收服务器的响应信息
                                    */
                                    byte[] data2 = new byte[1024];
                                    DatagramPacket packet2 = new DatagramPacket(data2,data2.length);
                                    socket.receive(packet2);
                                    String reply = new String(data2,0,packet2.getLength());
                                    System.out.println(reply);
                                    socket.close();
                          }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值