java多线程实现服务器端与多客户端之间的通信_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();
    }
  }
}

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索客户端与服务器端通信、qt多线程实现串口通信、多线程实现socket通信、tcp客户端和服务器端、udp服务器端和客户端,以便于您获取更多的相关知识。

时间: 2024-10-06 00:41:55

java多线程实现服务器端与多客户端之间的通信_java的相关文章

反向Ajax:Comet用于服务器与客户端之间响应通信的流和长轮询

客户端的示例使用的是 jQuery http://www.aliyun.com/zixun/aggregation/33906.html">JavaScript 库.在这首篇文章中,我们探索不同的反向 Ajax 技术,使用可下载的例子来学习使用了流 (streaming) 方法和长轮询 (long polling) 方法的 Comet. Web 开发在过去的几年中有了很大的进展,我们已经远超了把静态网页链接在一起的做法,这种做法会引起浏览器的刷新,并且要等待页面的加载.现在需要的是能够通过

详解Java多线程编程中LockSupport类的线程阻塞用法_java

LockSupport是用来创建锁和其他同步类的基本线程阻塞原语. LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark()不会遇到"Thread.suspend 和 Thread.resume所可能引发的死锁"问题. 因为park() 和 unpark()有许可的存在:调用 park() 的线程和另一个试图将其 unpark() 的线程之间的竞争将保持活性. 基本用法LockSupport 很类似于二元信号量

Java多线程之异步Future机制的原理和实现_java

项目中经常有些任务需要异步(提交到线程池中)去执行,而主线程往往需要知道异步执行产生的结果,这时我们要怎么做呢?用runnable是无法实现的,我们需要用callable看下面的代码: import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurren

Java多线程程序中synchronized修饰方法的使用实例_java

在Java 5以前,是用synchronized关键字来实现锁的功能. synchronized关键字可以作为方法的修饰符(同步方法),也可作用于函数内的语句(同步代码块). 掌握synchronized,关键是要掌握把那个东西作为锁.对于类的非静态方法(成员方法)而言,意味着要取得对象实例的锁:对于类的静态方法(类方法)而言,要取得类的Class对象的锁:对于同步代码块,要指定取得的是哪个对象的锁.同步非静态方法可以视为包含整个方法的synchronized(this) { - }代码块.  

Java多线程编程之访问共享对象和数据的方法_java

多个线程访问共享对象和数据的方式有两种情况: 1.每个线程执行的代码相同,例如,卖票:多个窗口同时卖这100张票,这100张票需要多个线程共享. 2.每个线程执行的代码不同,例如:设计四个线程,其中两个线程每次对j增加1,另外两个线程每次对j减少1. a.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个对象中有共享数据.卖票就可以这样做,每个窗口都在做卖票任务,卖的票都是同一个数据(点击查看具体案例). b.如果每个线程执行的代码不同,就需要使用不同的Runnable对象,有

Java多线程编程中synchronized关键字的基础用法讲解_java

多线程编程中,最关键.最关心的问题应该就是同步问题,这是一个难点,也是核心. 从jdk最早的版本的synchronized.volatile,到jdk 1.5中提供的java.util.concurrent.locks包中的Lock接口(实现有ReadLock,WriteLock,ReentrantLock),多线程的实现也是一步步走向成熟化.   同步,它是通过什么机制来控制的呢?第一反应就是锁,这个在学习操作系统与数据库的时候,应该都已经接触到了.在Java的多线程程序中,当多个程序竞争同一

详解Java多线程编程中互斥锁ReentrantLock类的用法_java

0.关于互斥锁 所谓互斥锁, 指的是一次最多只能有一个线程持有的锁. 在jdk1.5之前, 我们通常使用synchronized机制控制多个线程对共享资源的访问. 而现在, Lock提供了比synchronized机制更广泛的锁定操作, Lock和synchronized机制的主要区别: synchronized机制提供了对与每个对象相关的隐式监视器锁的访问, 并强制所有锁获取和释放均要出现在一个块结构中, 当获取了多个锁时, 它们必须以相反的顺序释放. synchronized机制对锁的释放是

Java多线程之中断线程(Interrupt)的使用详解_java

interrupt方法 interrupt字面上是中断的意思,但在Java里Thread.interrupt()方法实际上通过某种方式通知线程,并不会直接中止该线程.具体做什么事情由写代码的人决定,通常我们会中止该线程.     如果线程在调用Object类的wait().wait(long)或wait(long, int)方法,或者该类的 join() .join(long) .join(long, int) .sleep(long) 或 sleep(long, int) 方法过程中受阻,则其

在Java中String和Date、Timestamp之间的转换_java

一.String与Date(java.util.Date)互转      1.1 String -> Date String dateStr = "// ::"; Date date = new Date(); //注意format的格式要与日期String的格式相匹配 DateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); try { date = sdf.parse(dateStr); S