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

本文介绍如何使用Java实现服务器与多个客户端之间的多线程通信。服务器端通过ServerSocket创建并监听8888端口,接受客户端连接请求,每个连接都在单独线程上进行对话。客户端发送数据后关闭输出流,服务器响应后关闭输入流。
摘要由CSDN通过智能技术生成

应用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();

}

}

}

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
// 文件名: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); } } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值