zoukankan      html  css  js  c++  java
  • Java基础学习03--网络BIO

    1.服务端单线程:

    Server端:

     1 package socket.demo.singlethread;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.InputStream;
     5 import java.io.InputStreamReader;
     6 import java.net.ServerSocket;
     7 import java.net.Socket;
     8 
     9 public class Server {
    10     public static void main(String[] args) {
    11         try {
    12             //1.定义一个ServerSocket对象进行服务端的端口注册
    13             ServerSocket serverSocket = new ServerSocket(9999);
    14 
    15             //2.监听客户端的sokcet链接请求
    16             Socket socket = serverSocket.accept();
    17 
    18             //3.从客户端得到一个字节输入流对象
    19             InputStream inputStream = socket.getInputStream();
    20 
    21             //4.把字节输入流包装成缓冲字节输入流
    22             //BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
    23 
    24             //4.把字节输入流包装成缓冲字节输入流
    25             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
    26             String msg;
    27             while ((msg = bufferedReader.readLine()) != null) {
    28                 System.out.println("服务端接收到:" + msg);
    29             }
    30         } catch (Exception e) {
    31             e.printStackTrace();
    32         }
    33     }
    34 }

    Client端:

     1 package socket.demo.singlethread;
     2 
     3 import java.io.IOException;
     4 import java.io.OutputStream;
     5 import java.io.PrintStream;
     6 import java.net.Socket;
     7 
     8 public class Client {
     9     public static void main(String[] args) throws IOException {
    10         //1.创建Sokcet对象请求服务端
    11         Socket socket = new Socket("127.0.0.1", 9999);
    12 
    13         //2.从Socket对象中获取一个字节输出流
    14         OutputStream outputStream = socket.getOutputStream();
    15 
    16         //3.把字节输出流包装成打印流
    17         PrintStream printStream = new PrintStream(outputStream);
    18 
    19         //打印
    20         printStream.println("hello world");
    21 
    22         //刷新
    23         printStream.flush();
    24     }
    25 }

    2.服务端多线程

    Server端:

     1 package socket.demo.multithread;
     2 
     3 import java.net.ServerSocket;
     4 import java.net.Socket;
     5 
     6 public class Server {
     7     public static void main(String[] args) throws Exception {
     8         ServerSocket serverSocket = new ServerSocket(9999);
     9         while (true) {
    10             Socket socket = serverSocket.accept();
    11             new ServerThreadReader(socket).start();
    12         }
    13     }
    14 }

    线程类:

     1 package socket.demo.multithread;
     2 
     3 
     4 import java.io.BufferedReader;
     5 import java.io.IOException;
     6 import java.io.InputStream;
     7 import java.io.InputStreamReader;
     8 import java.net.Socket;
     9 
    10 public class ServerThreadReader extends Thread {
    11     private Socket socket;
    12 
    13     public ServerThreadReader(Socket socket) {
    14         this.socket = socket;
    15     }
    16 
    17     @Override
    18     public void run() {
    19         try {
    20             InputStream inputStream = this.socket.getInputStream();
    21             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
    22             String msg;
    23             while ((msg = bufferedReader.readLine()) != null) {
    24                 System.out.println(msg);
    25             }
    26 
    27         } catch (IOException e) {
    28             e.printStackTrace();
    29         }
    30     }
    31 }

    Client端:

     1 package socket.demo.multithread;
     2 
     3 import java.io.PrintStream;
     4 import java.net.Socket;
     5 import java.util.Scanner;
     6 
     7 public class Client {
     8     public static void main(String[] args) throws Exception {
     9         Socket socket = new Socket("127.0.0.1", 9999);
    10         PrintStream printStream = new PrintStream(socket.getOutputStream());
    11         Scanner scanner = new Scanner(System.in);
    12         while (true) {
    13             System.out.print("请输入:");
    14             String msg = scanner.nextLine();
    15             printStream.println(msg);
    16             printStream.flush();
    17         }
    18     }
    19 }

    3.C#版本服务端多线程,和Java的对比一下:

    Server端:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Net.Sockets;
     6 using System.Net;
     7 using System.Threading;
     8 
     9 namespace ServerSocket
    10 {
    11     class Program
    12     {
    13         private static byte[] m_DataBuffer = new byte[1024];
    14         //设置端口号
    15         private static int m_Port = 8099;
    16         static Socket serverSocket;
    17         static void Main(string[] args)
    18         {
    19             //为了方便在本机上同时运行Client和server,使用回环地址为服务的监听地址
    20             IPAddress ip = IPAddress.Loopback;
    21             //实例化一个Socket对象,确定网络类型、Socket类型、协议类型
    22             serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    23             //Socket对象绑定IP和端口号
    24             serverSocket.Bind(new IPEndPoint(ip, m_Port));
    25             //挂起连接队列的最大长度为15,启动监听
    26             serverSocket.Listen(15);
    27 
    28             Console.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString());
    29             //一个客户端连接服务器时创建一个新的线程
    30             Thread myThread = new Thread(ListenClientConnect);
    31             myThread.Start();
    32         }
    33 
    34         /// <summary>
    35         /// 接收连接
    36         /// </summary>
    37         private static void ListenClientConnect()
    38         {
    39             while (true)
    40             {
    41                 //运行到Accept()方法是会阻塞程序(同步Socket),
    42                 //收到客户端请求创建一个新的Socket Client对象继续执行
    43                 Socket clientSocket = serverSocket.Accept();
    44                 clientSocket.Send(Encoding.UTF8.GetBytes("Server说:Client 你好!"));
    45                 //创建一个接受客户端发送消息的线程
    46                 Thread reciveThread = new Thread(ReciveMessage);
    47                 reciveThread.Start(clientSocket);
    48             }
    49         }
    50           
    51         /// <summary>
    52         /// 接收信息
    53         /// </summary>
    54         /// <param name="clientSocket">包含客户端信息的套接字</param>
    55         private static void ReciveMessage(Object clientSocket)
    56         {
    57             if (clientSocket != null)
    58             {
    59                 Socket m_ClientSocket = clientSocket as Socket;
    60                 while (true)
    61                 {
    62                     try
    63                     {
    64                         //通过clientSocket接收数据
    65                         int reciverNumber = m_ClientSocket.Receive(m_DataBuffer);
    66                         if (reciverNumber == 0)
    67                         {
    68                             m_ClientSocket.Shutdown(SocketShutdown.Both);
    69                             m_ClientSocket.Close();
    70                             Console.WriteLine("客户端连接已断开");
    71                             break;
    72                         }
    73                         Console.WriteLine("接收客户端:{0}消息:{1}", m_ClientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(m_DataBuffer, 0, reciverNumber));
    74                     }
    75                     catch (Exception ex)
    76                     {
    77                         Console.WriteLine(ex.Message);
    78                         m_ClientSocket.Shutdown(SocketShutdown.Both);
    79                         m_ClientSocket.Close();
    80                         break;
    81                     }
    82                 }
    83             }
    84         }
    85     }
    86 }

    Client端:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Net.Sockets;
     6 using System.Net;
     7 using System.Threading;
     8 
     9 namespace ClientSocket
    10 {
    11     class Program
    12     {
    13         //创建一个数据缓冲区
    14         private static byte[] m_DataBuffer = new byte[1024];
    15         static void Main(string[] args)
    16         {
    17             IPAddress ip = IPAddress.Loopback;
    18             Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    19 
    20             try
    21             {
    22                 clientSocket.Connect(new IPEndPoint(ip, 8099));
    23                 Console.WriteLine("连接服务器成功");
    24             }
    25             catch (Exception ex)
    26             {
    27                 Console.WriteLine("连接服务器失败,按回车键退出");
    28                 Console.WriteLine(ex.Message);
    29                 return;
    30             }
    31             //通过clientSocket接收数据
    32             int receiveLength = clientSocket.Receive(m_DataBuffer);
    33             Console.WriteLine("接受服务器消息:{0}", Encoding.UTF8.GetString(m_DataBuffer, 0, receiveLength));
    34             //通过clientSocket发送数据
    35             for (int i = 0; i < 10; i++)
    36             {
    37                 try
    38                 {
    39                     Thread.Sleep(1000);
    40                     string sendMessage = string.Format("{0} {1}", "Server 你好!", DateTime.Now.ToString());
    41                     clientSocket.Send(Encoding.UTF8.GetBytes(sendMessage));
    42                     Console.WriteLine("向服务器发送消息:{0}", sendMessage);
    43                 }
    44                 catch
    45                 {
    46                     clientSocket.Shutdown(SocketShutdown.Both);
    47                     clientSocket.Close();
    48                     break;
    49                 }
    50             }
    51             Console.WriteLine("发送完毕,按回车键退出");
    52             //发送完消息后关闭连接
    53             clientSocket.Shutdown(SocketShutdown.Both);
    54             clientSocket.Close();
    55             Console.Read();
    56         }
    57     }
    58 }
  • 相关阅读:
    ViewController生命周期
    Core Data 基本数据操作 增删改查 排序
    Core data 如何查看ObjectId
    NSArary自定义对象排序 NSComparator, compare
    tcp/ip协议学习笔记一
    常用mac/unix/linux命令
    IOS pin约束问题 存在间隙
    IOS 常用View属性设置
    ubuntu 16.04菜单栏不显示
    linux实用命令备忘
  • 原文地址:https://www.cnblogs.com/asenyang/p/14159959.html
Copyright © 2011-2022 走看看