java多线程实现服务器端与多客户端之间的通信

用java语言构建一个网络服务器,实现客户端和服务器之间通信,实现客户端拥有独立线程,互不干扰。

应用多线程来实现服务器与多线程之间的通信的基本步骤

  1. 服务器端创建ServerSocket,循环调用accept()等待客户端链接
  2. 客户端创建一个Socket并请求和服务器端链接
  3. 服务器端接受客户端请求,创建socekt与该客户端建立专线链接
  4. 建立链接的socket在一个单独的线程上对话
  5. 服务器继续等待新的链接

服务器端Server.java

package test.concurrent.socket; 

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket; 

/**
 * Created by dong on 15-6-22.
 * 基于TCP协议的Socket通信,实现用户登录
 * 服务器端
 */
public class Server { 

  public static void main(String[] args) { 

    try {
      //1、创建一个服务器端Socket,即ServerSocket, 指定绑定的端口,并监听此端口
      ServerSocket serverSocket = new ServerSocket(8888);
      Socket socket = null;
      //记录客户端的数量
      int count = 0;
      System.out.println("***服务器即将启动,等待客户端的链接***");
      //循环监听等待客户端的链接
      while (true){
        //调用accept()方法开始监听,等待客户端的链接
        socket = serverSocket.accept();
        //创建一个新的线程
        ServerThread serverThread = new ServerThread(socket);
        //启动线程
        serverThread.start(); 

        count++; //统计客户端的数量
        System.out.println("客户端的数量: " + count);
        InetAddress address = socket.getInetAddress();
        System.out.println("当前客户端的IP : " + address.getHostAddress());
      } 

    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

服务器端线程处理类ServerThread.java

package test.concurrent.socket; 

import java.io.*;
import java.net.Socket; 

/**
 * Created by dong on 15-6-22.
 * 服务器端线程处理类
 */
public class ServerThread extends Thread { 

  //和本线程相关的Socket
  Socket socket = null;
  public ServerThread(Socket socket){
    this.socket = socket;
  } 

  //线程执行的操作,响应客户端的请求
  public void run(){ 

    InputStream is = null;
    InputStreamReader isr = null;
    BufferedReader br = null; 

    OutputStream os = null;
    PrintWriter pw = null;
    try { 

      //获取一个输入流,并读取客户端的信息
      is = socket.getInputStream();
      isr = new InputStreamReader(is); //将字节流转化为字符流
      br = new BufferedReader(isr); //添加缓冲
      String info = null;
      //循环读取数据
      while ((info = br.readLine()) != null){
        System.out.println("我是服务器,客户端说: " +info);
      } 

      socket.shutdownInput(); //关闭输入流 

      //获取输出流,响应客户端的请求
      os = socket.getOutputStream();
      pw = new PrintWriter(os); //包装为打印流
      pw.write("欢迎你");
      pw.flush(); //将缓存输出 

    } catch (IOException e) {
      e.printStackTrace();
    }finally { 

        try {
          //关闭资源
          if (pw != null)
            pw.close();
          if (os != null)
            os.close();
          if (is != null)
            is.close();
          if (isr != null)
            isr.close();
          if (br != null)
            br.close();
          if (socket != null)
            socket.close();
        } catch (IOException e) {
          e.printStackTrace(); 

        } 

    } 

  }
}

客户端Client.java

package test.concurrent.socket; 

import java.io.*;
import java.net.Socket; 

/**
 * Created by dong on 15-6-22.
 * 客户端
 */
public class Client { 

  public static void main(String[] args) { 

    try {
      //1、创建客户端Socket,指定服务器端口号和地址
      Socket socket = new Socket("localhost",8888);
      //2、获取输出流,向服务器发送信息
      OutputStream os = socket.getOutputStream(); //字节输出流
      PrintWriter pw = new PrintWriter(os); //将输出流包装为打印流
      pw.write("用户名:tom; 密码:456");
      pw.flush();
      socket.shutdownOutput(); //关闭输出流 

      InputStream is = socket.getInputStream();
      InputStreamReader isr = new InputStreamReader(is);
      BufferedReader br = new BufferedReader(isr); 

      String info = null;
      //循环读取
      while ((info = br.readLine()) != null){
        System.out.println("我是客户端:服务器说:" + info);
      } 

      br.close();
      is.close();
      isr.close(); 

      pw.close();
      os.close();
      socket.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2016-10-24

Java多线程之readwritelock读写分离的实现代码

在多线程开发中,经常会出现一种情况,我们希望读写分离.就是对于读取这个动作来说,可以同时有多个线程同时去读取这个资源,但是对于写这个动作来说,只能同时有一个线程来操作,而且同时,当有一个写线程在操作这个资源的时候,其他的读线程是不能来操作这个资源的,这样就极大的发挥了多线程的特点,能很好的将多线程的能力发挥出来. 在Java中,ReadWriteLock这个接口就为我们实现了这个需求,通过他的实现类ReentrantReadWriteLock我们可以很简单的来实现刚才的效果,下面我们使用一个例子

java实现多线程之定时器任务

在Java中Timer是java.util包中的一个工具类,提供了定时器的功能.我们可以创建一个Timer对象,然后调用其schedule方法在某个特定的时间去执行一个特定的任务.并且你可以让其以特定频率一直执行某个任务,这个任务是用TimerTask来描述的,我们只需要将要进行的操作写在TimerTask类的run方法中即可.先附上两个小例子一遍让读者了解什么是定时器.接着再分析其中的一些源码实现. 第一个小例子: package com.zkn.newlearn.thread; import

JAVA多线程并发下的单例模式应用

单例模式应该是设计模式中比较简单的一个,也是非常常见的,但是在多线程并发的环境下使用却是不那么简单了,今天给大家分享一个我在开发过程中遇到的单例模式的应用. 首先我们先来看一下单例模式的定义: 一个类有且仅有一个实例,并且自行实例化向整个系统提供. 单例模式的要素: 1.私有的静态的实例对象 2.私有的构造函数(保证在该类外部,无法通过new的方式来创建对象实例) 3.公有的.静态的.访问该实例对象的方法 单例模式分为懒汉形和饿汉式 懒汉式: 应用刚启动的时候,并不创建实例,当外部调用该类的实例

简单谈谈RxJava和多线程并发

前言 相信对于RxJava,大家应该都很熟悉,他最核心的两个字就是异步,诚然,它对异步的处理非常的出色,但是异步绝对不等于并发,更不等于线程安全,如果把这几个概念搞混了,错误的使用RxJava,是会来带非常多的问题的. RxJava与并发 首先让我们来看一段RxJava协议的原文: Observables must issue notifications to observers serially (not in parallel). They may issue these notificat

Java多线程实现聊天客户端和服务器

本文实例为大家分享了java聊天室代码,供大家参考,具体内容如下 主要涉及知识 ·Java中GUI程序的编写,包括事件监听机制. ·Java的网络通信编程,ServerSocket,Socket类的使用. ·Java中多线程的编程,Thread类,Runnable接口的使用. 源代码 客户端 package project1; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; impo

Java多线程下载文件实例详解

本文实例为大家分享了Java多线程下载文件的具体代码,供大家参考,具体内容如下 import java.io.File; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; public class MulThreadDownload { public static void main(String[] args)

Java多线程--让主线程等待所有子线程执行完毕在执行

朋友让我帮忙写个程序从文本文档中导入数据到oracle数据库中,技术上没有什么难度,文档的格式都是固定的只要对应数据库中的字段解析就行了,关键在于性能. 数据量很大百万条记录,因此考虑到要用多线程并发执行,在写的过程中又遇到问题,我想统计所有子进程执行完毕总共的耗时,在第一个子进程创建前记录当前时间用System.currentTimeMillis()在最后一个子进程结束后记录当前时间,两次一减得到的时间差即为总共的用时,代码如下 long tStart = System.currentTime

Java实现等待所有子线程结束后再执行一段代码的方法

本文实例讲述了Java实现等待所有子线程结束后再执行一段代码的方法.分享给大家供大家参考,具体如下: 今天有一个需求是:在一个方法中开启了一个子线程来执行操作,返回值依赖于子线程的执行结果,这样如果要返回正确的值,就需要开启子线程后 主线程等待子线程,然后子线程执行结束后,主线程再继续执行. 主线程等待子线程需要用到:CountDownLatch 代码如下: import java.util.concurrent.CountDownLatch; public class Counter { pu

java多线程编程之使用thread类创建线程

在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例.Thread类的构造方法被重载了八次,构造方法如下: 复制代码 代码如下: public Thread( );public Thread(Runnable target);public Thread(String name);public Thread(Ru

java多线程编程之使用runnable接口创建线程

1.将实现Runnable接口的类实例化. 2.建立一个Thread对象,并将第一步实例化后的对象作为参数传入Thread类的构造方法. 最后通过Thread类的start方法建立线程.下面的代码演示了如何使用Runnable接口来创建线程: package mythread;public class MyRunnable implements Runnable{ public void run() {  System.out.println(Thread.currentThread().get

整理总结Java多线程程序编写的要点

线程状态图 线程共包括以下5种状态. 1. 新建状态(New)         : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread(). 2. 就绪状态(Runnable): 也被称为"可执行状态".线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程.例如,thread.start().处于就绪状态的线程,随时可能被CPU调度执行. 3. 运行状态(Running) : 线程获取CPU权限进行执行.需要注意的是,

java基本教程之java线程等待与java唤醒线程 java多线程教程

本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long timeout)和notify()4. wait() 和 notifyAll()5. 为什么notify(), wait()等函数定义在Object中,而不是Thread中 wait(), notify(), notifyAll()等方法介绍在Object.java中,定义了wait(), notify()

理解java多线程中ExecutorService使用

java.util.concurrent包里提供了关于多线程操作的类,平常用的比较多的是ExecutorService及其实现类(如ThreadPoolExecutor等),Executor,Executors,Future,Callable等 1. ExecutorService(继承自Executor)接口:提供了一些异步的多线程操作方法,如execute(), submit(), shutdown(), shutdownNow()等 2. Executor接口:执行提交的任务(线程),只有

java多线程编程学习(线程间通信)

一.概要 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体,线程间的通信就是成为整体的必用方案之一.可以说,使线程进行通信后,系统之间的交互性会更强大,在大大提高cpu利用率的同时还会使程序员对各线程任务在处理过程中进行有效的把控和监督. 二.等待/通知机制 1."wait/notify"机制:等待/通知机制,wait使线程暂停运行,而notify 使暂停的线程继续运行.用一个厨师和服务员的交互来说明: (1) 服务员取到菜的时间取决于厨师,所以服务员就有&

Java 多线程并发编程_动力节点Java学院整理

一.多线程 1.操作系统有两个容易混淆的概念,进程和线程. 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进程的地址空间是互相隔离的:进程拥有各种资源和状态信息,包括打开的文件.子进程和信号处理. 线程:表示程序的执行流程,是CPU调度执行的基本单位:线程有自己的程序计数器.寄存器.堆栈和帧.同一进程中的线程共用相同的地址空间,同时共享进进程锁拥有的内存和其他资源. 2.Java标准库提供了进程和线程相关的API,进程主要包括表示进程的jav

Java 多线程学习详细总结

目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1