JAVA多线程服务器实现

之前就有听说过java多线程服务器的实现是通过Socket来实现,大致还是创建多个socket来实现的把。今天写了一份demo来模拟多线程服务器,可能实际开发并不是这样写的,但大题思路还是一样。
服务器端

package Socket;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {
    public static void main(String[] args) throws IOException {
        //创建socket,绑定到65000端口
        ServerSocket serverSocket=new ServerSocket(65000);
        //循环用以监听
        while (true){//这是多线程的,通过循环创建多个socket来实现
            //监听65000端口,直到有客户端信息发过来
            Socket socket=serverSocket.accept();
            //执行相关操作
            new CaluteLength(socket).start();
        }
    }
}

服务器端调用方法

package Socket;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class CaluteLength extends Thread{
    //以Socket为成员变量
    private Socket socket;
    public CaluteLength(Socket socket){this.socket=socket;}

    @Override
    public void run(){
        try {
            //获取Socket输出流
            OutputStream outputStream=socket.getOutputStream();
            //获取输入流
            InputStream inputStream=socket.getInputStream();
            int ch=0;
            byte[] buff=new byte[1024];
            //buff用来读取输入的内容,ch用来获取数组长度
            ch=inputStream.read(buff);
            String content=new String(buff,0,ch);//把字节流转为字符串
            int i=0;
            System.out.println("这是客户端"+content+":"+i);
            while (true){
                i++;
                Thread.sleep(1000);
                System.out.println("这是客户端"+content+":"+i);
            }
            //如果有必要可以在输出流中写入要回传的数据
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

客户端

package Socket;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class TCPClient {
    public static void main(String[] args) throws IOException {
        //创建Socket,并指定连接的是本机的端口号为65000的服务器socket
        Socket socket=new Socket("127.0.0.1",65000);
        // 获取输出流
        OutputStream outputStream=socket.getOutputStream();
        //获取输入流
        InputStream inputStream=socket.getInputStream();
        //转为byte数组,写到输入流中
        outputStream.write(new String("hello socket").getBytes());
        int ch=0;
        byte[] buff=new byte[1024];
        ch=inputStream.read(buff);
        String content=new String(buff,0,ch);//content是输入流的数据,即字符串长度
        System.out.println(content);
        inputStream.close();
        outputStream.close();
        socket.close();
    }
}

首先开启服务器端,然后开启客户端,可以开启多个客户端来实现测试多线程
在这里插入图片描述
经过学习,总结出,在服务器端,通过ServerSocket,循环创建socket,当serverSocket.accept();接收到发过来的Socket消息时才会继续执行。然后这里是新建了一个方法类,它继承了Thread,重写了run方法,这也是实现多线程的基本方法,应该要很熟悉。只有多写这些多线程的实例才能真正理解多线程编程的艺术,运用到实际开发中。

  • 2
    点赞
  • 0
    评论
  • 8
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

// 文件名:moreServer.java import java.io.*; import java.net.*; import java.util.*; /** * <p>Title: 多线程服务器</p> * <p>Description: 本实例使用多线程实现服务功能。</p> * <p>Copyright: Copyright (c) 2003</p> * <p>Filename: </p> * @author 杜江 * @version 1.0 */ class moreServer { public static void main (String [] args) throws IOException { System.out.println ("Server starting...\n"); //使用8000端口提供服务 ServerSocket server = new ServerSocket (8000); while (true) { //阻塞,直到有客户连接 Socket sk = server.accept (); System.out.println ("Accepting Connection...\n"); //启动服务线程 new ServerThread (sk).start (); } } } //使用线程,为多个客户端服务 class ServerThread extends Thread { private Socket sk; ServerThread (Socket sk) { this.sk = sk; } //线程运行实体 public void run () { BufferedReader in = null; PrintWriter out = null; try{ InputStreamReader isr; isr = new InputStreamReader (sk.getInputStream ()); in = new BufferedReader (isr); out = new PrintWriter ( new BufferedWriter( new OutputStreamWriter( sk.getOutputStream ())), true); while(true){ //接收来自客户端的请求,根据不同的命令返回不同的信息。 String cmd = in.readLine (); System.out.println(cmd); if (cmd == null) break; cmd = cmd.toUpperCase (); if (cmd.startsWith ("BYE")){ out.println ("BYE"); break; }else{ out.println ("你好,我是服务器!"); } } }catch (IOException e) { System.out.println (e.toString ()); } finally { System.out.println ("Closing Connection...\n"); //最后释放资源 try{ if (in != null) in.close (); if (out != null) out.close (); if (sk != null) sk.close (); } catch (IOException e) { System.out.println("close err"+e); } } } }
©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值