当前位置: 移动技术网 > IT编程>开发语言>Java > java多线程实现服务器端与多客户端之间的通信

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

2019年07月22日  | 移动技术网IT编程  | 我要评论
用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(); 
    } 
  } 
} 

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

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网