zoukankan      html  css  js  c++  java
  • 初识Socket通信:基于TCP和UDP协议学习网络编程

    学习笔记:

    1.基于TCP协议的Socket网络编程:

      (1)Socket类构造方法:在客户端和服务器端建立连接

        Socket s = new Socket(hostName,port);以主机名和端口号作为参数来创建一个Socket对象。

        Socket s = new Socket(address,port);以InetAddress对象和端口号作为参数来创建一个Socket对象。

      创建Socket对象时可能抛出UnknownHostException或IOException异常,必须捕获它们。

      (2)常用方法

        InetAddress getInetAddress();返回与Socket对象关联的InetAddress

        int getPort();远程端口

        int getLocalPort();本地端口

        InputStream getInputStream();相关联的InputStream

        OutputStream getOutputStream();相关联的OutputStream

        void close();关闭该Socket

      (3)ServerSocket类:等待客户端建立连接,连接以后进行通信

        ServerSocket ss = new ServerSocket(port);接收端口号作为参数

        ServerSocket ss = new ServerSocket(port,maxqueue);接收端口号和最大队列长度作为参数。

        accept();等待客户端触发通信

     1 import java.io.BufferedReader;
     2 import java.io.IOException;
     3 import java.io.InputStream;
     4 import java.io.InputStreamReader;
     5 import java.io.OutputStream;
     6 import java.net.ServerSocket;
     7 import java.net.Socket;
     8 
     9 /**
    10  * 使用Socket变成实现用户登录
    11  * 1.实现单用户登录
    12  * 2.服务器端关键代码
    13  * @author Administrator
    14  *
    15  */
    16 public class Test0101 {
    17 
    18     public static void main(String[] args) {
    19         try {
    20             //创建一个服务器Socket(ServerSocket),指定端口8800并开始监听
    21             ServerSocket serverSocket = new ServerSocket(8800);
    22             //使用accept()方法等待客户端触发通信
    23             Socket socket = serverSocket.accept();
    24             //打开输入/输出流
    25             InputStream is = socket.getInputStream();
    26             OutputStream os = socket.getOutputStream();
    27             //获取客户端信息,即从输入流读取信息
    28             BufferedReader br = new BufferedReader(new InputStreamReader(is));
    29             String info = null;
    30             while(!((info = br.readLine())==null)){
    31                 System.out.println("我是服务器,客户登录信息为:"+info);
    32             }
    33             socket.shutdownInput();
    34             //给客户端一个响应,即向输出流写入信息
    35             String reply = "欢迎你,登陆成功!";
    36             os.write(reply.getBytes());
    37             os.close();
    38             br.close();
    39             is.close();
    40             socket.close();
    41             serverSocket.close();
    42         } catch (IOException e) {
    43             e.printStackTrace();
    44         }
    45     }
    46 
    47 }
     1 import java.io.BufferedReader;
     2 import java.io.IOException;
     3 import java.io.InputStream;
     4 import java.io.InputStreamReader;
     5 import java.io.OutputStream;
     6 import java.net.Socket;
     7 import java.net.UnknownHostException;
     8 
     9 /**
    10  * 使用Socket变成实现用户登录
    11  * 1.实现单用户登录
    12  * 2.客户端关键代码
    13  * @author Administrator
    14  *
    15  */
    16 public class Test01 {
    17 
    18     public static void main(String[] args) {
    19         try {
    20             //建立客户端Socket连接,指定服务器的位置为本机以及端口8800
    21             Socket socket = new Socket("127.0.0.1",8800);
    22             //打开输入/输出流
    23             OutputStream os = socket.getOutputStream();
    24             InputStream is = socket.getInputStream();
    25             //发送客户端登录信息,即向输出流写入信息
    26             String info = "用户名:Tom;用户密码:123456";
    27             os.write(info.getBytes());
    28             socket.shutdownOutput();
    29             //接受服务器端的响应,即从输入流读取信息
    30             String reply = null;
    31             BufferedReader br = new BufferedReader(new InputStreamReader(is));
    32             while(!((reply = br.readLine())==null)){
    33                 System.out.println("我是客户端,服务器端的响应为:"+reply);
    34             }
    35             //关闭资源
    36             br.close();
    37             is.close();
    38             os.close();
    39             socket.close();
    40         } catch (UnknownHostException e) {
    41             e.printStackTrace();
    42         } catch (IOException e) {
    43             e.printStackTrace();
    44         }
    45         
    46     }
    47 
    48 }
     1 import java.io.IOException;
     2 import java.io.InputStream;
     3 import java.io.ObjectInputStream;
     4 import java.io.OutputStream;
     5 import java.net.ServerSocket;
     6 import java.net.Socket;
     7 
     8 /**
     9  * 服务器端关键代码
    10  * @author Administrator
    11  *
    12  */
    13 public class Test0201 {
    14 
    15     public static void main(String[] args) {
    16         try {
    17             //创建一个服务器Socket(ServerSocket)连接,指定端口并开始监听
    18             ServerSocket serverSocket = new ServerSocket(8800);
    19             //使用accpet()方法等待客户端触发通信
    20             Socket socket = serverSocket.accept();
    21             //打开输入输出流
    22             InputStream is = socket.getInputStream();
    23             OutputStream os = socket.getOutputStream();
    24             //反序列化
    25             ObjectInputStream ois = new ObjectInputStream(is);
    26             //获取客户端信息(从输入流读取信息)
    27             User user = (User)ois.readObject();
    28             if (!(user==null)) {
    29                 System.out.println("我是服务器端,客户登录信息为:
    用户名:"+user.getLoginName()+",密码:"+user.getPwd());
    30             }
    31             //给客户端一个响应(向输出流写入信息)
    32             String reply = "欢迎你,登陆成功!";
    33             os.write(reply.getBytes());
    34             //关闭资源
    35             os.close();
    36             ois.close();
    37             is.close();
    38             socket.close();
    39             serverSocket.close();
    40         } catch (ClassNotFoundException e) {
    41             e.printStackTrace();
    42         } catch (IOException e) {
    43             e.printStackTrace();
    44         }
    45 
    46     }
    47 
    48 }
     1 import java.io.BufferedReader;
     2 import java.io.IOException;
     3 import java.io.InputStream;
     4 import java.io.InputStreamReader;
     5 import java.io.ObjectOutputStream;
     6 import java.io.OutputStream;
     7 import java.net.Socket;
     8 import java.net.UnknownHostException;
     9 
    10 /**
    11  * 客户端关键代码
    12  * @author Administrator
    13  *
    14  */
    15 public class Test02 {
    16 
    17     public static void main(String[] args) {
    18         try {
    19             //建立客户端Socket连接,指定服务器的位置和端口
    20             Socket socket = new Socket("127.0.0.1",8800);
    21             //打开输入输出流
    22             OutputStream os = socket.getOutputStream();
    23             InputStream is = socket.getInputStream();
    24             //对象序列化
    25             ObjectOutputStream oos = new ObjectOutputStream(os);
    26             //发送客户端登录信息(向输出流写入数据)
    27             User user = new User();
    28             user.setLoginName("Tom");
    29             user.setPwd("12345678");
    30             oos.writeObject(user);
    31             socket.shutdownOutput();
    32             //接收服务器端的响应(从输入流读取信息)
    33             String reply = null;
    34             BufferedReader br = new BufferedReader(new InputStreamReader(is));
    35             while(!((reply = br.readLine())==null)){
    36                 System.out.println("我是客户端,服务器端的响应为"+reply);
    37             }
    38             //关闭资源
    39             br.close();
    40             oos.close();
    41             is.close();
    42             os.close();
    43             socket.close();
    44         } catch (UnknownHostException e) {
    45             e.printStackTrace();
    46         } catch (IOException e) {
    47             e.printStackTrace();
    48         }
    49 
    50     }
    51 
    52 }

    案例:实现多客户端用户登录

    1.登录线程类

     1 import java.io.IOException;
     2 import java.io.InputStream;
     3 import java.io.ObjectInputStream;
     4 import java.io.OutputStream;
     5 import java.net.Socket;
     6 
     7 /**
     8  * 登录线程类
     9  * @author Administrator
    10  *
    11  */
    12 public class LoginThread extends Thread {
    13     Socket socket = null;
    14     //每启动一个线程,连接对应的Socket接口
    15     public LoginThread(Socket socket){
    16         this.socket = socket;
    17     }
    18     //启动线程,即响应客户请求
    19     public void run(){
    20         try {
    21             //打开输入输出流
    22             InputStream is = socket.getInputStream();
    23             OutputStream os = socket.getOutputStream();
    24             //反序列化
    25             ObjectInputStream ois = new ObjectInputStream(is);
    26             //获取客户端信息(从输入流读取信息)
    27             User user = (User)ois.readObject();
    28             if (!(user==null)) {
    29                 System.out.println("我是服务器端,客户登录信息为:
    用户名:"+user.getLoginName()+",密码:"+user.getPwd());
    30             }
    31             //给客户端一个响应(向输出流写入信息)
    32             String reply = "欢迎你,登陆成功!";
    33             os.write(reply.getBytes());
    34             //关闭资源
    35             os.close();
    36             ois.close();
    37             is.close();
    38             socket.close();
    39         } catch (ClassNotFoundException e) {
    40             e.printStackTrace();
    41         } catch (IOException e) {
    42             e.printStackTrace();
    43         }
    44     }
    45 
    46 }

    2.服务器端的响应

     1 import java.io.IOException;
     2 import java.net.ServerSocket;
     3 import java.net.Socket;
     4 
     5 /**
     6  * 服务器端关键代码
     7  * @author Administrator
     8  *
     9  */
    10 public class Test0301 {
    11 
    12     public static void main(String[] args) {
    13         try {
    14             //创建一个服务器Socket(ServerSocket),指定端口并开始监听
    15             @SuppressWarnings("resource")
    16             ServerSocket serverSocket = new ServerSocket(8800);
    17             //使用accpet()方法等待客户端触发通信
    18             Socket socket = null;
    19             while (true) {
    20                 //监听一直进行中
    21                 socket = serverSocket.accept();
    22                 LoginThread login = new LoginThread(socket);
    23                 login.start();
    24             }
    25         } catch (IOException e) {
    26             e.printStackTrace();
    27         }
    28 
    29     }
    30 
    31 }

    3.客户登陆

     1 import java.io.BufferedReader;
     2 import java.io.IOException;
     3 import java.io.InputStream;
     4 import java.io.InputStreamReader;
     5 import java.io.ObjectOutputStream;
     6 import java.io.OutputStream;
     7 import java.net.Socket;
     8 import java.net.UnknownHostException;
     9 
    10 /**
    11  * 实现多客户端用户登录
    12  * @author Administrator
    13  *
    14  */
    15 public class Test03 {
    16 
    17     public static void main(String[] args) {
    18         try {
    19             //建立客户端Socket连接,指定服务器的位置和端口
    20             Socket socket = new Socket("127.0.0.1",8800);
    21             //打开输入输出流
    22             OutputStream os = socket.getOutputStream();
    23             InputStream is = socket.getInputStream();
    24             //对象序列化
    25             ObjectOutputStream oos = new ObjectOutputStream(os);
    26             //发送客户端登录信息(向输出流写入数据)
    27             User user = new User();
    28             user.setLoginName("Kate");
    29             user.setPwd("12345678");
    30             oos.writeObject(user);
    31             socket.shutdownOutput();
    32             //接收服务器端的响应(从输入流读取信息)
    33             String reply = null;
    34             BufferedReader br = new BufferedReader(new InputStreamReader(is));
    35             while(!((reply = br.readLine())==null)){
    36                 System.out.println("我是客户端,服务器端的响应为"+reply);
    37             }
    38             //关闭资源
    39             br.close();
    40             oos.close();
    41             is.close();
    42             os.close();
    43             socket.close();
    44         } catch (UnknownHostException e) {
    45             e.printStackTrace();
    46         } catch (IOException e) {
    47             e.printStackTrace();
    48         }
    49     }
    50 
    51 }

    二、InetAddress类中的工厂方法

      static InetAddress getLocalHost();返回本地主机InetAddress对象

      static InetAddress getByName(String hostName);返回InetAddress对象

      static InetAddress[] getAllByName(String hostName);返回主机名~所有主机对象组

     1 import java.net.InetAddress;
     2 import java.net.UnknownHostException;
     3 
     4 /**
     5  * 获取淘宝网服务器地址
     6  * @author Administrator
     7  *
     8  */
     9 public class Test002 {
    10 
    11     public static void main(String[] args) {
    12         //定义目标网址
    13         String target = "localhost";
    14         System.out.println("------淘宝的主服务器地址------");
    15         InetAddress iad;
    16         try {
    17             iad = InetAddress.getByName(target);
    18             System.out.println(iad);
    19         } catch (UnknownHostException e) {
    20             e.printStackTrace();
    21         }
    22         
    23         System.out.println("------淘宝的所有服务器地址------");
    24         InetAddress[] iads;
    25         try {
    26             iads = InetAddress.getAllByName(target);
    27             System.out.println(target+"的IP地址有"+iads.length+"个,分别是:");
    28             for (InetAddress ia : iads) {
    29                 System.out.println(ia);
    30             }
    31         } catch (UnknownHostException e) {
    32             e.printStackTrace();
    33         }
    34 
    35     }
    36 
    37 }
  • 相关阅读:
    后缀自动机/回文自动机/AC自动机/序列自动机----各种自动机(自冻鸡) 题目泛做
    BZOJ 1001 狼抓兔子 (网络流最小割/平面图的对偶图的最短路)
    FFT与多项式、生成函数题目泛做
    BZOJ 2243 SDOI 2011染色
    莫队/分块 题目泛做
    Cogs 12 运输问题2 (有上下界网络流)
    可并堆/左偏树 题目泛做
    TC快速搜索在win10下不可用
    (转)Tomcat调优
    (转)Tomcat文件详解
  • 原文地址:https://www.cnblogs.com/tengqiuyu/p/6870178.html
Copyright © 2011-2022 走看看