• 如何开发一个SocketServerClient模型的程序



       开发原理:

       服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。

       客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。

       {建立服务器}

    package org.tx;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.ArrayList;
    import java.io.DataInputStream;  
    import java.io.DataOutputStream;  
    import java.io.BufferedReader;
    import java.io.InputStreamReader;

    public class socketServer
    {
     ArrayList clientList = new ArrayList();
     
     public static void main(String[] args)
     {
      //在main函数中,启动服务器的socket
      new socketServer().OpenServer();
      
     }
     
     public void OpenServer()//启动socketServer
     {
      try
      {
       ServerSocket server = new ServerSocket(10001);//端口设为10001
       
       Socket socket;
       while((socket = server.accept())!=null)
       {
         clientList.add(socket);
         //clientName = socket.getInetAddress().toString();
         //output = new DataOutputStream(socket.getOutputStream());
         //input = new DataInputStream(socket.getInputStream());
         new readClient(socket).start();
         new writeClient(socket).start();
       }
      }
      catch(Exception e)
      {System.out.println(e.toString());}
     }
     
     public class readClient extends Thread
     {
      private Socket socket;
      
      public readClient(Socket client)
      {socket = client;}
      
      public void run()
      {
       String msg;
       try
       {
        String clientName = socket.getInetAddress().toString();
        DataOutputStream output = new DataOutputStream(socket.getOutputStream());
        DataInputStream input = new DataInputStream(socket.getInputStream());
        while((msg = input.readUTF())!=null)
        {
         System.out.println("收到消息:【"+clientName+"】 "+msg); 
        }
       }
       catch(Exception e){System.out.println(e.toString());}
      } 
     }
     
     public class writeClient extends Thread
     {
      private Socket socket;
      
      public writeClient(Socket client)
      {socket = client;}
     
      public void run()
      {
       try{
        
        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        String userInput;
        String clientName = socket.getInetAddress().toString();
        DataOutputStream output = new DataOutputStream(socket.getOutputStream());
        DataInputStream input = new DataInputStream(socket.getInputStream());
        while(true)
        {
         if(stdIn.ready())
         {
          userInput = stdIn.readLine();
          if(userInput!="exit")
          {
           output.writeUTF(userInput);
           System.out.println("已发送消息给【"+clientName+"】"+userInput);
          }
         }
        }
       }
       catch(Exception e) {System.out.println(e.toString());}
      }
     }
     
    }

       这个程序建立了一个服务器,它一直监听10001端口,等待用户连接。在建立连接后给客户端返回一段信息,然后结束会话。这个程序一次只能接受一个客户连接。


       {建立客户端}

    package org.tx;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.io.DataInputStream;  
    import java.io.DataOutputStream;  
    import java.io.BufferedReader;
    import java.io.InputStreamReader;

    public class socketClient
    {
     private DataOutputStream output;
     private DataInputStream input;
     private String clientName;
     
     public static void main(String[] args)
     {
      //在main函数中,启动服务器的socket
      new socketClient().ConnectServer();
     }
     
     public void ConnectServer()
     {
      try
      {
       Socket socket = new Socket("127.0.0.1",10001);//
       clientName = socket.getInetAddress().toString();
       input = new DataInputStream(socket.getInputStream());
       output = new DataOutputStream(socket.getOutputStream());
       
       new readServer().start();
       new writeServer().start();
      }
      catch(Exception e) {System.out.println(e.toString());}
     }
     
     public class readServer extends Thread
     {
      private Socket client;

      public void run()
      {
       String msg;
       try
       {
        while(true)
        {
         msg = input.readUTF();
         if(msg!=null)
          System.out.println("收到消息:【"+clientName+"】 "+msg); 
        }
       }
       catch(Exception e) {System.out.println(e.toString());}
      } 
     }
     
     public class writeServer extends Thread
     {
      private Socket client;

      
      public void run()
      {
       try
       {
        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        String userInput;
        while(true)
        {
         if(stdIn.ready())
         {
          userInput = stdIn.readLine();
          if(userInput!="exit")
          {
           output.writeUTF(userInput);
           System.out.println("已发送消息给【"+clientName+"】"+userInput);
          }
         }
        }
       }
       catch(Exception e) {System.out.println(e.toString());}
      }
     }
     
    }


       多个客户同时连接,主程序监听一端口,等待客户接入;同时构造一个线程类,准备接管会话。当一个Socket会话产生后,将这个会话交给线程处理,然后主程序继续监听。运用Thread类或Runnable接口来实现是不错的办法。这个客户端连接到地址为xxx.xxx.xxx.xxx的服务器,端口为10001,并从键盘输入一行信息,发送到服务器,然后接受服务器的返回信息,最后结束会话。

  • 相关阅读:
    多线程实现看病Test2
    多线程Test1
    实现注册的账户在重新运行程序后依然可以登录
    教资科一科二pdf资料+科三
    error Custom elements in iteration require 'v-bind:key' directives vue/valid-v-for
    vue-router配置路由出现错误: Mixed spaces and tabs no-mixed-spaces-and-tabs
    [vue-router] route config "component" for path:canot be a string id. Use an actual compone
    20 个超赞的 CSS3 库
    20个简洁的 JS 代码片段
    Vue 前端代码风格指南 |
  • 原文地址:https://www.cnblogs.com/wuyida/p/6301135.html
Copyright © 2020-2023  润新知