zoukankan      html  css  js  c++  java
  • TCP

    一、Socket是什么:

    Socket是连接运行在网络上的两个程序间的双向通讯的端点。

    为了能够方便的开发网络应用软件,由美国伯克利大学在Unix上推出了一种应用程序访问通信协议的操作系统调socket(套接字)。socket的出现,使程序员可以很方便地访问TCP/IP,从而开发各种网络应用的程序。随着Unix的应用推广,套接字在编写网络软件中得到了极大的普及。后来,套接字又被引进了Windows等操作系统中。Java语言也引入了套接字编程模型。

    二、使用Socket进行网络通信的过程:

    1.服务器程序将一个套接字绑定到一个特定的端口,并通过此套接字等待和监听客户的连接请求。

    2.客户程序根据服务器程序所在的主机名和端口号发出连接请求。

    3.如果一切正常,服务器接受连接请求。并获得一个新的绑定到不同端口地址的套接字。

    4.客户和服务器通过读、写套接字进行通讯。

    三、使用ServerSocket和Socket实现服务器端和客户端的 Socket通信总结:

    1.建立Socket连接

    2. 获得输入/输出流

    3.读/写数据

    4.关闭输入/输出流

    5. 关闭Socket

    Server端

     1 import java.net.ServerSocket;
     2 import java.net.Socket;
     3 import java.io.BufferedReader;
     4 import java.io.IOException;
     5 import java.io.InputStream;
     6 import java.io.InputStreamReader;
     7 import java.io.OutputStream;
     8 import java.io.OutputStreamWriter;
     9 import java.io.PrintWriter;
    10 
    11 /*
    12  * 基于TCP协议的Socket通信,实现用户登陆
    13  * 服务器端
    14  */
    15 public class Server {
    16     public static void main(String[] args) {
    17         try {
    18             // 创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
    19             ServerSocket serverSocket = new ServerSocket(8888);
    20             Socket socket = null;
    21             System.out.println("服务器启动");
    22 
    23             // 监听等待客户端的连接
    24             socket = serverSocket.accept();
    25 
    26             InputStream is = socket.getInputStream();
    27             InputStreamReader isr = new InputStreamReader(is);
    28             BufferedReader br= new BufferedReader(isr);
    29 
    30             String a;
    31             while ((a = br.readLine()) != null) {
    32                 System.out.println("用户信息:" + a);
    33             }
    34             
    35             OutputStream os = socket.getOutputStream();
    36             OutputStreamWriter osw=new OutputStreamWriter(os);
    37             //osw.write("asd");
    38             PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流
    39             pw.write("welcome");
    40             pw.flush();
    41             
    42             osw.close();
    43             os.close();
    44             br.close();
    45             isr.close();
    46             is.close();
    47             
    48             socket.close();
    49             serverSocket.close();
    50             
    51         } catch (IOException e) {
    52             e.printStackTrace();
    53         }
    54     }
    55 }
    View Code

    Client端

     1  package test_1;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.IOException;
     5 import java.io.InputStream;
     6 import java.io.InputStreamReader;
     7 import java.io.OutputStream;
     8 import java.io.PrintWriter;
     9 import java.net.Socket;
    10 import java.net.UnknownHostException;
    11 
    12 /*
    13  * 客户端
    14  */
    15 public class Client {
    16     public static void main(String[] args) {
    17         try {
    18             //创建客户端Socket,指定服务器地址和端口
    19             Socket socket=new Socket("localhost", 8888);
    20             //获取输出流,向服务器端发送信息
    21             OutputStream os=socket.getOutputStream();//字节输出流
    22             PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流
    23             pw.write("用户名:alice;密码:789");
    24             pw.flush();
    25             socket.shutdownOutput();//关闭输出流
    26             //获取输入流,并读取服务器端的响应信息
    27             InputStream is=socket.getInputStream();
    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             //4.关闭资源
    34             br.close();
    35             is.close();
    36             pw.close();
    37             os.close();
    38             socket.close();
    39         } catch (UnknownHostException e) {
    40             e.printStackTrace();
    41         } catch (IOException e) {
    42             e.printStackTrace();
    43         }
    44     }
    45 }
    View Code

     多线程的Server端:

     1 package test_1;
     2 
     3 import java.net.InetAddress;
     4 import java.net.ServerSocket;
     5 import java.net.Socket;
     6 import java.io.IOException;
     7 
     8 /*
     9  * 基于TCP协议的Socket通信,实现用户登陆
    10  * 服务器端
    11  */
    12 public class Server {
    13     public static void main(String[] args) {
    14         try {
    15             // 创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
    16             ServerSocket serverSocket = new ServerSocket(8888);
    17             Socket socket = null;
    18             System.out.println("服务器启动");
    19             
    20             while(true){
    21                 // 监听等待客户端的连接
    22                 socket = serverSocket.accept();
    23                 
    24                 Serverthread serverthread=new Serverthread(socket);
    25                 
    26                 serverthread.start();
    27                 InetAddress address=socket.getInetAddress();
    28                 System.out.println("当前客户端的IP:"+address.getHostAddress());
    29             }
    30 
    31             
    32         } catch (IOException e) {
    33             e.printStackTrace();
    34         }
    35     }
    36 }
    37 
    38 
    39 package test_1;
    40 
    41 import java.io.BufferedReader;
    42 import java.io.IOException;
    43 import java.io.InputStream;
    44 import java.io.InputStreamReader;
    45 import java.io.OutputStream;
    46 import java.io.OutputStreamWriter;
    47 import java.io.PrintWriter;
    48 import java.net.Socket;
    49 
    50 public class Serverthread extends Thread{
    51     Socket socket=null;
    52     
    53     public Serverthread(Socket socket) {
    54         this.socket=socket;
    55     }
    56     
    57     public void run() {
    58         try {
    59             InputStream is = socket.getInputStream();
    60             InputStreamReader isr = new InputStreamReader(is);
    61             BufferedReader br= new BufferedReader(isr);
    62 
    63             String a;
    64             while ((a = br.readLine()) != null) {
    65                 System.out.println("用户信息:" + a);
    66             }
    67             
    68             OutputStream os = socket.getOutputStream();
    69             OutputStreamWriter osw=new OutputStreamWriter(os);
    70             //osw.write("asd");
    71             PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流
    72             pw.write("welcome");
    73             pw.flush();
    74             
    75             osw.close();
    76             os.close();
    77             br.close();
    78             isr.close();
    79             is.close();
    80             
    81             socket.close();
    82         } catch (IOException e) {
    83             // TODO 自动生成的 catch 块
    84             e.printStackTrace();
    85         }
    86         
    87     };
    88 }
  • 相关阅读:
    myEclipse Debug
    C# DataTable的詳細使用方法
    算法 《秦九韶算法java实践》
    【闲聊产品】之五:谁来背黑锅?
    ubuntu install mysql server method
    H264解码的一个測试程序
    Struts2自己定义拦截器实例—登陆权限验证
    【剑指offer】二叉树的镜像
    ubuntu12.04下搭建ftpserver
    C++Vector使用方法
  • 原文地址:https://www.cnblogs.com/daneres/p/4670735.html
Copyright © 2011-2022 走看看