zoukankan      html  css  js  c++  java
  • Sokect简单入门(2)TCP协议二

    通过多线程实现服务器端的多用户访问

    一、线程方法

      

     1 import java.io.IOException;
     2 import java.io.InputStream;
     3 import java.io.ObjectInputStream;
     4 import java.io.OutputStream;
     5 import java.io.PrintWriter;
     6 import java.net.ServerSocket;
     7 import java.net.Socket;
     8 
     9 import pb.socket.entity.User;
    10 
    11 /**
    12  * 专门的线程类
    13  * */
    14 public class ServerThread extends Thread {
    15     //和本线程相关的Socket
    16     Socket socket=null;
    17     
    18     public ServerThread(Socket socket){
    19         this.socket=socket;
    20     }
    21     
    22     //线程启动:响应客户请求
    23     public void run(){
    24         try {
    25             //3.获得输入流
    26             InputStream is=socket.getInputStream();
    27             //获得流:可以对对象进行反序列化
    28             ObjectInputStream ois=new ObjectInputStream(is);
    29             //获得输出流
    30             OutputStream os=socket.getOutputStream();
    31             PrintWriter pw=new PrintWriter(os);
    32             //4.读取用户输入信息
    33             User user=(User)ois.readObject();
    34             System.out.println("用户信息:"+user.getLoginName()+"---"+user.getPwd());
    35             //给客户一个响应
    36             String reply="welcome!";
    37             pw.write(reply);
    38             pw.flush();
    39             //5.关闭资源
    40             pw.close();
    41             os.close();
    42             ois.close();
    43             is.close();
    44             socket.close();
    45         } catch (IOException e) {
    46             // TODO Auto-generated catch block
    47             e.printStackTrace();
    48         } catch (ClassNotFoundException e) {
    49             // TODO Auto-generated catch block
    50             e.printStackTrace();
    51         }
    52     }
    53 }

    二、服务器端代码

    /**
     * 服务器端
     * */
    public class LoginServer {
        public static void main(String[] args) {
            try {
                //1.建立一个服务器Socket(ServerSocket)绑定指定端口并开始监听
                ServerSocket serverSocket=new ServerSocket(8800);
                //2.使用accept()方法阻塞等待监听,获得新的连接
                Socket socket=null;
                //客户数量
                int num=0;
                //一直处于监听状态
                while(true){
                    socket=serverSocket.accept();
                    ServerThread serverThread=new ServerThread(socket);
                    serverThread.start();
                    num++;
                    System.out.println("客户数量为:"+num);
                    
                    //客户的IP信息
                    InetAddress ia=socket.getInetAddress();
                    //客户的Ip
                    String ip=ia.getHostAddress();
                    System.out.println("本客户的IP为:"+ip);
                    //客户的主机名称
                    String hostname=ia.getHostName();
                    System.out.println("本客户的主机为:"+hostname);
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
            
        }
    }

     三、客户端代码

     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.io.PrintWriter;
     8 import java.net.Socket;
     9 import java.net.UnknownHostException;
    10 
    11 import pb.socket.entity.User;
    12 
    13 /**
    14  * 客户端
    15  * */
    16 public class LoginClient {
    17     public static void main(String[] args) {
    18         try {
    19             //1.建立客户端Socket连接,指定服务器的位置以及端口
    20             Socket socket=new Socket("localhost",8800);
    21             //2.得到Socket的读写流
    22             OutputStream os=socket.getOutputStream();
    23             //对象序列化流
    24             ObjectOutputStream oos=new ObjectOutputStream(os);
    25             //输入流
    26             InputStream is=socket.getInputStream();
    27             BufferedReader br=new BufferedReader(new InputStreamReader(is));
    28             //3.利用流按照一定的协议对Socket进行读/写操作
    29             User user=new User();
    30             user.setLoginName("kate");
    31             user.setPwd("120056");
    32             oos.writeObject(user);
    33             
    34             socket.shutdownOutput();
    35             //接受服务器的响应并打印显示
    36             String reply=null;
    37             while(!((reply=br.readLine())==null)){
    38                 System.out.println("我是客户端,服务器的响应为:"+reply);
    39             }
    40             //4.关闭资源
    41             br.close();
    42             is.close();
    43             oos.close();
    44             os.close();
    45             socket.close();
    46         } catch (UnknownHostException e) {
    47             // TODO Auto-generated catch block
    48             e.printStackTrace();
    49         } catch (IOException e) {
    50             // TODO Auto-generated catch block
    51             e.printStackTrace();
    52         }
    53         
    54     }
    55 }
    一个走投无路的庄稼汉
  • 相关阅读:
    U1. 广度优先搜索(BFS)和 广度优先搜索(DFS)
    C5. Spring 服务的注册与发现(Spring Cloud Eureka)
    S3. Android 消息推送
    S2. Android 常用控件
    S12. Android 检查更新功能实现
    S1. Android 功能大全
    B9 Concurrent 重入锁(ReentrantLock)
    117.dom2事件
    106.事件的传播机制
    105.事件对象及兼容处理
  • 原文地址:https://www.cnblogs.com/kuangyefeige/p/9822847.html
Copyright © 2011-2022 走看看