zoukankan      html  css  js  c++  java
  • socket客户端和服务端通信

    一、BufferedReader和BufferedWriter

    客户端代码:

     1 package main.java;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.BufferedWriter;
     5 import java.io.IOException;
     6 import java.io.InputStream;
     7 import java.io.InputStreamReader;
     8 import java.io.OutputStream;
     9 import java.io.OutputStreamWriter;
    10 import java.net.Socket;
    11 import java.net.UnknownHostException;
    12 /**
    13  * 客户端发送写死的信息给服务器(BufferedWriter),客户端读取服务器响应返回的信息(BufferedReader)
    14  * @author whh
    15  *
    16  */
    17 public class SocketClient1 {
    18     public static void main(String[] args) throws UnknownHostException, IOException {
    19             
    20         //创建Socket通信,设置访问服务器的IP和Port
    21         Socket  socket = new Socket("127.0.0.1",90);
    22         //输出流向服务器发送数据消息
    23         OutputStream outputStream = socket.getOutputStream();
    24         OutputStreamWriter osw = new OutputStreamWriter(outputStream);
    25         BufferedWriter bw = new  BufferedWriter(osw);
    26         //输入流读取服务器发送来的数据消息
    27         InputStream inputStream = socket.getInputStream();
    28         InputStreamReader inputStreamReader  =new InputStreamReader(inputStream);
    29         BufferedReader br  = new BufferedReader(inputStreamReader);
    30         //向服务器端发送一条消息  
    31         bw.write("测试客户端和服务器通信,服务器接收到消息返回到客户端");
    32         bw.newLine();
    33         bw.flush();
    34         System.out.println("我是客户端,已经连接到服务器:"+socket.getRemoteSocketAddress());
    35         
    36                 
    37         String readLine = null;
    38         while ((readLine = br.readLine()) != null){
    39             System.out.println("来自服务端的消息:"+readLine);
    40         }
    41         socket.close();
    42     }
    43     
    44 }

    服务端代码:

     1 package main.java;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.BufferedWriter;
     5 import java.io.InputStream;
     6 import java.io.InputStreamReader;
     7 import java.io.OutputStream;
     8 import java.io.OutputStreamWriter;
     9 import java.net.ServerSocket;
    10 import java.net.Socket;
    11 /**
    12  * 服务器读取客户端发送的信息(BufferedReader),
    13  * 服务器发送写死的响应信息到客户端(BufferedWriter)
    14  * @author whh
    15  *
    16  */
    17 public class SocketServer1 {
    18     public static void main(String[] args) throws Exception{
    19         //服务器建立通信ServerSocket,并设置端口号
    20         ServerSocket serverSocket = new  ServerSocket(90);
    21         System.out.println("启动服务器....");
    22         while(true){
    23             Socket clientSocket = serverSocket.accept();//然后接受新的连接请求    //阻塞直到有客户端连接上  
    24             System.out.println("客户端:"+clientSocket.getInetAddress().getLocalHost()+"已连接到服务器");
    25             try {
    26                 process(clientSocket);
    27             } catch (Exception e) {
    28                 e.printStackTrace();
    29                 clientSocket.close();    
    30             }    
    31         }
    32         
    33     }
    34     public  static void process(Socket clientSocket) throws Exception{
    35         System.out.println("client socket连接:"+clientSocket.getRemoteSocketAddress());
    36         //输入流:读取客户端发送信息
    37         InputStream in = clientSocket.getInputStream();
    38         InputStreamReader isr = new InputStreamReader(in);
    39         BufferedReader br = new  BufferedReader(isr);
    40         //输出流:返回给客户端响应信息
    41         OutputStream out = clientSocket.getOutputStream();
    42         OutputStreamWriter osw = new OutputStreamWriter(out);
    43         BufferedWriter bw  = new BufferedWriter(osw);
    44         String line = null;
    45         while ((line = br.readLine()) != null){
    46             System.out.println("来自客户端的消息:" + line);
    47             bw.write("welcome from server.");
    48             bw.newLine();
    49             bw.flush();
    50         }
    51     }
    52 }


    * 注意事项:转自http://blog.csdn.net/keketrtr/article/details/47128999
    上面的java Socket通信用到了BufferedReader的readLine()方法和BufferedWriter的write()方法。
    注意readLine()方法,通过查看JDK中关于此方法的注释可知,它是读取一行数据,这行数据的末尾必须有换行符标识符说明到此为止是一行。不然readLine()方法无法顺利读取。
    所以在服务器端或客户端进行输出的时候必须输出换行标识( ),让对方可以顺利读取一行。因此可以这样写writer.write("hello world ")。为了更好地使用java的跨平台特性,BufferedWriter提供了一个newLine()方法,该方法就是专门输出一个换行符。所以也可以这样写writer.write("hello world");writer.newLine();
    另外既然是BufferedWriter,自然用到了缓冲,当你输出的字符长度不超过缓冲区时,可能不会被输出,这时候程序也无法正常运行。所以要用writer.flush();刷新缓冲区。也就是说writer.write("我接收到你的数据:"+input);writer.newLine();writer.flush();必须一起使用,它们总是同时出现,因此你可以自定义一个方法,包含这三个方法。
      public void writeLine(String msg){
       writer.write(msg);

       writer.newLine();

       writer.flush();
      }

    二、PrintWriter和BufferedReader :在控制台输入,读取

    客户端代码:

     1 package main.java;
     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 import java.util.Scanner;
    12 /**
    13  * 客户端发送控制台输入的信息给服务器,服务器在控制台输入信息返回给用户:PrintWriter
    14  * @author whh
    15  *
    16  */
    17 public class SocketClient2 {
    18     public static void main(String[] args) throws UnknownHostException, IOException {
    19         
    20 //        try {
    21             //创建Socket通信,设置通信服务器的IP和Port
    22             Socket  socket = new Socket("127.0.0.1",9090);
    23             //建立IO输入流读取服务器发送来的数据消息
    24             InputStream inputStream = socket.getInputStream();
    25             InputStreamReader inputStreamReader  =new InputStreamReader(inputStream);
    26             BufferedReader br  = new BufferedReader(inputStreamReader);
    27             //建立IO输出流向服务器发送数据消息
    28             OutputStream outputStream = socket.getOutputStream();
    29 //            OutputStreamWriter osw = new OutputStreamWriter(outputStream);
    30             boolean autoflush = true;
    31             PrintWriter pw = new  PrintWriter(outputStream, autoflush);
    32             //在控制台输入信息
    33             System.out.println("请输入信息:");
    34             Scanner scan = new Scanner(System.in);
    35             String send = scan.nextLine();
    36             //发送到服务器
    37             pw.println(send);
    38             
    39             // read the response
    40             System.out.println(socket.getRemoteSocketAddress());
    41             String readLine = br.readLine();
    42             System.out.println("来自服务端的消息:"+readLine+"end...");
    43             socket.close();
    44     }
    45     
    46     
    47     
    48 
    49 

    服务端代码:

     1 package main.java;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.InputStream;
     5 import java.io.InputStreamReader;
     6 import java.io.OutputStream;
     7 import java.io.OutputStreamWriter;
     8 import java.io.PrintWriter;
     9 import java.net.ServerSocket;
    10 import java.net.Socket;
    11 import java.util.Scanner;
    12 /**
    13  * 客户端发送控制台输入的信息给服务器,服务器在控制台输入信息返回给用户:PrintWriter
    14  * @author whh
    15  *
    16  */
    17 public class SocketServer2 {
    18     public static void main(String[] args) throws Exception{
    19         //服务器建立通信ServerSocket,并设置端口号
    20         ServerSocket serverSocket = new  ServerSocket(9090);
    21         System.out.println("启动服务器....");
    22         while(true){
    23             Socket clientSocket = serverSocket.accept();//然后接受新的连接请求    //阻塞直到有客户端连接上  
    24             System.out.println("客户端:"+clientSocket.getInetAddress().getLocalHost()+"已连接到服务器");
    25             try {
    26                 process(clientSocket);
    27             } catch (Exception e) {
    28                 e.printStackTrace();
    29                 clientSocket.close();    
    30             }    
    31         }
    32         
    33     }
    34     public  static void process(Socket clientSocket) throws Exception{
    35         System.out.println("client socket连接:"+clientSocket.getRemoteSocketAddress());
    36         //输入流
    37         InputStream in = clientSocket.getInputStream();
    38         InputStreamReader isr = new InputStreamReader(in);
    39         BufferedReader br = new  BufferedReader(isr);
    40         //输出流
    41         OutputStream out = clientSocket.getOutputStream();
    42         OutputStreamWriter osw = new OutputStreamWriter(out);
    43 //        BufferedWriter bw  = new BufferedWriter(osw);
    44         PrintWriter pw = new PrintWriter(out,true);
    45         String line = null;
    46         while ((line = br.readLine()) != null){
    47             System.out.println("客户输入信息为:" + line);
    48             //在控制台输入信息
    49             System.out.println("请输入返回客户信息:");
    50             Scanner scan = new Scanner(System.in);
    51             String messToClient = scan.nextLine();
    52             //发送到客户端
    53             pw.println("welcome from server..."+messToClient+"end...");
    54             System.err.println("server  end...");
    55             pw.flush();
    56         }
    57          
    58         
    59         
    60         
    61         
    62     }
    63     
    64     
    65 
    66 }

     三、SocketTest客户端和SocketServer

    1.SocketTest

    SocketTest V3.0.0 客户端下载地址:http://sockettest.sourceforge.net/

    SocketTest作为客户端测试工具,可以不用写客户端代码,直接连接服务端SocketServer

    在IP Address中输入访问服务的IP地址,若访问本机,则输入:127.0.0.1(服务器套接字将会监听本地机器。)

    然后点击connect,连接服务器。

    连接成功后,在Message输入信息,点击send,发送到服务器。然后可以在conversation with host 查看返回的结果 。

    所以 可以借助SocketTest来实现客户端和服务端交互,测试服务端代码是否正确。

    2.SocketServer

    SocketServer构造方法的重载形式有以下几种:

    ◆ServerSocket()throws IOException 
    ◆ServerSocket(int port) throws IOException 
    ◆ServerSocket(int port, int backlog) throws IOException
    ◆ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException     //对于这个构造方法,绑定地址必须是java.net.InetAddress的一个实例

    如:new ServerSocket(8080, 1, InetAddress.getByName("127.0.0.1"));

    其中,参数:port为:服务器要绑定的端口(服务器要监听的端口),

                         backlog为:这是服务器套接字开始拒绝传入的请求之前,传入的连接请求的最大队列长度

                         bindAddr为:服务器要绑定的IP地址。

    你需要指定IP地址和服务器套接字将要进行监听的端口号。通常,IP地址将会是127.0.0.1,也就是说,服务器套接字将会监听本地机器。

  • 相关阅读:
    [Go] 解决packets.go:36: read tcp 127.0.0.1:51139->127.0.0.1:3306: wsarecv: An established connection was aborted by the software in your host ma chine.
    [javascript] js格式化时间为xx秒前、xx分钟前、xx小时前等
    [日常]UserAgent中的AhrefsBot解释
    [PHP] laravel 框架多项目公用redis会有默认前缀 项目名_database_key
    [Go] go run 时 os.Getwd 和 os.Executable 获取程序根路径
    [laravel] 关闭laravel数据库model维护create_at update_at
    [Go]go.mod 文件中的// indirect意思代表间接依赖
    [Go] 解决 imported from implicitly required module
    [mysql] 解决SQLSTATE[HY000]: General error: 1366 Incorrect integer value: '' for column
    [PHP] windows环境下PHP增加rdkafka扩展 解决需要ext-rdkafka问题
  • 原文地址:https://www.cnblogs.com/whhjava/p/7889984.html
Copyright © 2011-2022 走看看